目录
find
grep
sed
awk
find
find(查找)沿着文件目录依次向下遍历,匹配符合条件的文件,可以附带相应的选项,默认的操作结果是打印出符合条件的文件与目录
用法如下:find 路径 选项
-
-name(根据文件名查找,可使用通配符)
#查找所有后缀为.txt的文件, find ./ -name "*.txt"
-
-type(根据文件类型查找)
#查找所有普通文件 find ./ -type f #Linux所有文件类型: f:普通文件 d:目录 c:字符设备 b:块设备 p:管道文件 s:socket文件 l:链接文件(硬链接、软链接)
-
-size n[cwbkMG](根据文件大小查找)
单位如下:
- `b' for 512-byte blocks (this is the default if no suffix is used)
- `c' for bytes
- `w' for two-byte words
- `k' for Kilobytes (units of 1024 bytes)
- `M' for Megabytes (units of 1048576 bytes)
- `G' for Gigabytes (units of 1073741824 bytes)
fzf@fzf:~/work/DailyTest/Shell/regex$ ls -l total 8 -rw-rw-r-- 1 fzf fzf 79 Dec 25 21:14 my.html -rw-rw-r-- 1 fzf fzf 42 Dec 25 16:47 regex #当前目录下查找大于50字节的文件 fzf@fzf:~/work/DailyTest/Shell/regex$ find ./ -type f -size +50c ./my.html #当前目录下查找大于30字节且小于80字节的文件 fzf@fzf:~/work/DailyTest/Shell/regex$ find ./ -type f -size +30c -size -80c ./my.html ./regex
-
(根据文件深度查找)
-maxdepth # 最大深度 -mindepth # 最小深度 find ./ -maxdepth 1 -name "*.sh"
-
-exec 和 -ok
把前面执行的结果传给-exec后面的命令,{}表示find命令执行结果,;表示结束
find ./ -name "*.sh" -exec ls -lh {}; find ./ -name "*.sh" -ok ls -lh {}; #需要用户确认再执行动作 -
-xargs 配合管道使用
find ./ -maxdepth 1 -name "*.sh" | xargs ls -lh
-
-print0(把find命令得到的结果根据null进行分割),xargs后面的-0表示根据null来取
目录下创建"test test.sh"文件: touch test test.sh fzf@fzf:~/work/DailyTest/Shell/sed$ ls -lh total 4.0K -rw-rw-r-- 1 fzf fzf 15 Dec 27 00:12 1.txt -rw-rw-r-- 1 fzf fzf 0 Dec 27 21:49 test test.sh #因为xargs默认是以空格、tab来分割文件的,所以此处会报找不到./test及test.sh文件 fzf@fzf:~/work/DailyTest/Shell/sed$ find ./ -maxdepth 1 -name "*.sh" | xargs ls -l ls: cannot access ./test: No such file or directory ls: cannot access test.sh: No such file or directory fzf@fzf:~/work/DailyTest/Shell/sed$ find ./ -maxdepth 1 -name "*.sh" -print0| xargs -0 ls -l -rw-rw-r-- 1 fzf fzf 0 Dec 27 21:49 ./test test.sh fzf@fzf:~/work/DailyTest/Shell/sed$ find ./ -maxdepth 1 -name "*.sh" -print0 | xargs -0 ls -lh
-
-atime(访问时间)单位:天
-amin 单位:分钟
-
-mtime(文件内容修改时间)单位:天
-mmin 单位:分钟
-
-ctime(文件属性修改时间)- 单位:天
-cmin 单位:分钟
#当前目录下寻找文件内容修改时间是5天之前的.sh文件:
find ./ -name "*.sh" -mtime +5 -exec ls -lh {} ;
#当前目录下寻找文件内容修改时间是5天以内前的.sh文件:
find ./ -name "*.sh" -mtime -5 -exec ls -lh {} ;
grep
用于在文件中查找匹配的行,默认使用基本正则,通过-E指定使用扩展正则。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
grep -n "fang" 1.txt
#递归调用:
grep -R "fang" ./
fzf@fzf:~/work/DailyTest/Shell/regex$ cat regex
192.168.51.1
w1.182.189.18
8.8.8.8
abc q
#匹配Ip地址:
#使用基本正则(){}+?需要转义
grep "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex
grep -E "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex
egrep "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex
sed
-
sed命令:sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
-
它主要是以行为主,一行一行处理。
sed命令:sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
它主要是以行为主,一行一行处理。
用法如下:
sed 参数 '脚本语句' 待操作文件 sed 参数 -f 脚本文件 待操作文件 脚本语句的格式为:/pattern/action 默认使用基本正则,如要使用扩展正则,通过-r选项
常用参数:
-n:静默输出
-r:使用扩展正则
-i:直接修改文件,慎用
常用action:
追加 a
插入 i
删除 d
替换 s
打印 p
示例:
fzf@fzf:~/work/DailyTest/Shell$ cat 1.txt fang fzf@fzf:~/work/DailyTest/Shell$ sed '1a dddd' 1.txt fang dddd fzf@fzf:~/work/DailyTest/Shell$ sed '1i dddd' 1.txt dddd fang fzf@fzf:~/work/DailyTest/Shell$ sed '1d' 1.txt fzf@fzf:~/work/DailyTest/Shell$ fzf@fzf:~/work/DailyTest/Shell$ sed 's/fang/juan/g' 1.txt juan fzf@fzf:~/work/DailyTest/Shell$ cat 1.txt fang zhan feng fzf@fzf:~/work/DailyTest/Shell$ sed '1,3d' 1.txt
当进行替换操作时,定界符可以为其它字符:
sed 's:test:TEXT:g'
sed 's|test|TEXT|g'
awk
-
awk是处理列的一个非常强大的工具,也是流编辑器,默认的列分隔符为空格或tab键,也可以通过参数指定
awk是处理列的一个非常强大的工具,也是流编辑器,默认的列分隔符为空格或tab键,也可以通过参数指定
用法如下:
awk 参数 '脚本语句' fileName
awk 参数 -f 脚本文件 fileName
脚本语句的格式为/pattern/{action}
条件(pattern):
一般使用关系表达式作为条件
x > 10 判断变量x是否大于10
x >=10 大于等于
x<=10 小于等于
动作(action):
格式化输出
流程控制语句
常用参数:
-f:指定脚本文件
-F:指定分隔符,默认为空格或tab键
内部变量:
FS:指定分隔符
$1表示第一列, $0表示对应的行
fzf@fzf:~/work/DailyTest$ df -h | awk '{print $1 "t" $3}'
Filesystem Used
/dev/sda3 5.2G
none 0
udev 4.0K
tmpfs 1.5M
none 0
none 0
none 0
/dev/sda1 77M
/dev/sda2 1.4G
该命令解决了用cut命令的局限性。
在awk中,可以用FS内置变量指定分割符为哪个字符,这个和cut的-d选项类似。
fzf@fzf:~/work/DailyTest$ awk 'BEGIN {FS=":"} {printf("%sn", $7)}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
查找pid在[1900, 2000]的进程总数:
ps aux | awk '$2>=1900 && $2<=2000 {count=count+1} END {print count}'


