简介
grep是Linux下的行过滤命令,它是一种部分匹配,即行内包含我们指定的字符串即可,不需要全部匹配。如果想要完全匹配,需要加^和$.
常用选项
- -i 忽略大小写
- -n 标明多少行
- -c 统计匹配的行数
- -o 只输出行中匹配的部分
- -v 不包含
- -r 递归过滤(对目录下的所有子目录的文件进行过滤)
- -C # 显示匹配到的行时,顺便显示前面和后面的#行
- -A # 显示匹配到的行时,顺便显示后面的#行
- -B # 显示匹配到的行时,顺便显示前面的#行
- –color 高亮显示匹配字符串
- 在1.txt中查找含有zn的行,不区分大小写
cat 1.txt | grep -i 'zn'
- 在1.txt中查找含有zn的行,并显示匹配行的行号
cat 1.txt | grep -n 'zn'
- 在1.txt中统计含有zn的行数
cat 1.txt | grep -c 'zn'
- 在1.txt中查找不包含zn的行
cat 1.txt | grep -v 'zn'
- 在zn目录下递归查找所有文件中包含zn的行
grep -r 'zn' zn
- 在1.txt中查找包含zn的行,并显示该行的上三行和下三行
cat 1.txt | grep -C 3 'zn'
- 在1.txt中查找包含zn的行,只输出匹配的部分
cat 1.txt | grep -o 'zn'
- 在1.txt中查找包含zn的行,并用颜色高亮显示匹配的部分
cat 1.txt | grep --color 'zn'
常用正则匹配
单个字符
- .代表单个任意字符
- 范围内任意字符 [a-z]
- 范围外任意字符
[^a-z]
重复紧跟其前的字符串
-
0次或1次
\?
比如
a\?
代表没有a或者一个a, 查找1.txt文件中含有0个或1个a的行cat 1.txt | grep 'a\?'
-
0,1或多次
比如 a*代表没有a,1个a或多个a ,查找1.txt文件中含有任意个a的行
cat 1.txt | grep 'a*'
-
1次或多次
\{1,\}
比如
a\{1,\}
代表至少一个a, 查找1.txt文件中至少含有一个a的行cat 1.txt | grep 'a\{1,\}'
-
n次
\{n\}
比如
a\{2\}
代表aa, 查找1.txt文件中含有aa的行cat 1.txt | grep 'a\{2\}'
开头结尾
-
^ 以什么开头
比如 ^a代表以a开头
,查找1.txt文件中以a开头的行cat 1.txt | grep '^a'
-
$以什么结尾
比如 a$代表以a结尾
,查找1.txt文件中以a结尾的行cat 1.txt | grep 'a$'
-
空行 ^$
查找1.txt文件中的空行
cat 1.txt | grep '^$'
单词(单词的前后需要有空格)
-
\<
以什么开头的单词比如 \<good代表以good开头的单词,good之前需要有空格
查找1.txt文件中的含有以good开头的单词的行cat 1.txt | grep '\<good'
-
\>
以什么结尾的单词比如 good\>代表以good结尾的单词,good之后需要有空格
查找1.txt文件中的含有以good结尾的单词的行cat 1.txt | grep 'good\>'
-
\<good\>
查找含有good单词的行cat 1.txt | grep '\<good\>'
分组(与前面相同)
-
\(..\) \1
比如 \(like\).* \1$ 代表的就是前面出现like,并以like结尾
查找1.txt中,good后面还有good的行 cat 1.txt | grep '\(good\).* \1'
字符与字符集
- [:digit:] 数字 [0-9]或者\d(linux下不一定支持)
- [:alpha:] 字母 [a-zA-Z]
- [:lower:] 小写字母
- [:upper:] 大小字母
- [:alnum:] 字母或数字
- [:punct:] 标点符号
- [:space:] 空白字符
- \d 数字 (mac下可以使用,centos不行)
- \w 数字,字母或下划线
- \s 空白字符,包括空格,制表符,换行符等,等价于
[\f\t\r\n]
- 查找1.txt中含有数字的行(注意:两个空括号)
cat 1.txt | grep '[[:digit:]]'
cat 1.txt | grep '\d'
- 查找1.txt中含有空白字符的行
cat 1.txt | grep '[[:space:]]'
cat 1.txt | grep '\s'
常见应用
(1)、显示/proc/meminfo文件中以不区分大小的s开头的行; grep "^[sS]" /proc/meminfo
(2)、显示/etc/passwd中以nologin结尾的行; grep "nologin$" /etc/passwd
(3)、显示/etc/inittab中的空行; grep "^$" /etc/inittab
(4)、显示/etc/passwd中,以r开头的字符而后跟了任意单个字符的行;(–color 高亮显示匹配字符串) grep --color "^r." /etc/passwd
(5)、显示/etc/passwd中,以r开头后跟了o,o出现任意次的行; grep --color "^ro*" /etc/passwd
(6)、显示/etc/passwd文件中,r后跟了任意长度任意字符,接着跟了h的行; grep --color "r.*h" /etc/passwd
(7)、显示/etc/passwd中,r后跟了o,o出现0次或者1次的行; grep --color "ro\?" /etc/passwd
(8)、显示/etc/passwd中,r后跟了o,o出现至少1次至多2次的行; grep --color "ro\{1,2\}" /etc/passwd
(9)、显示/etc/passwd中,r后跟了o,o只出现2次的行; grep --color "ro\{2\}" /etc/passwd
(10)、显示/etc/passwd中,匹配root这个单词的行; grep --color "\<root\>" /etc/passwd