grep命令

grep命令用于查找文件里面符合条件的字符串。如果发现某些文件的内容符合所指定的范本样式,预设的grep指令会把含有范本样式的那一行显示出来。

匹配成功,则返回0;匹配不成功,则返回1;如果指定的文件不存在,则返回2

若未指定文件名称,或指定的文件名为-,则grep会从标准输入设备读取数据。

grep语法

grep [参数] pattern [files]

参数
-A n:除了返回匹配的行之外,再返回匹配行之后的n
-B n:同上,再返回匹配行之前的n
-C n:同上,再返回匹配行前后的n
-c:返回匹配的总行数
-a:匹配二进制数据
-E:正则匹配
-f:规则文件
-i:忽略大小写
-w:匹配整个单词
-v:取反;显示不匹配的行
-s:不显示错误信息
-q:不显示任何信息
-n:显示行号
-r:递归查找文件夹

grep正则表达式

包含sed命令的所有字符集
^:行开头
$:行结尾
.:任意一个非换行字符
*:零个或多个字符
[]:指定范围内的字符。如/[ab]cc/可以匹配acc或者bcc[^]:不在指定范围内的字符
\(..\):匹配子串。s/\(love\)able/\1rsloveable替换为lovers1表示第一组括号
&:保留搜索字符,用来替换其他字符。s/love/*&*/结果为*love*\<:匹配单词开头
\>:匹配单词结尾。/love\>/包含以love结尾的单词
x\{m\}:重复字符x出现m次。/a\{3\}/表示包含3a的行
x\{m,\}:至少m
x\{m,n\}m~n

\w:匹配文字和数字字符。[A-Z a-z 0-9]\W\w取反。匹配一个或多个非单词字符,如句号、空格
\b:单词锁定。如\bhello\b只会匹配hello

grep案例

1、过滤IP地址信息

ip a | egrep '([0-9]{1,3\.}){3}'

egrep等同于grep -E

2、同时过滤多个关键字

egrep "root|oper|mail" /etc/passwd

|表示或者

3、当前目录下所有.txt文件,且连续包含7个小写字符的行

grep "\w\{7\}" *.txt
grep "[a-z]\{7\}" *.txt

4、匹配hello单词,不区分大小写

grep -iw "hello" log.txt

注意
使用egrep时,{}可以不用转义。可参考第1个例子

grep高级用法——断言

先行断言 x(?=y)x的右边是y是匹配成功

后发断言 (?<=y)xx的左边是y时匹配成功

负向零宽先行断言 x(?!y)x右边不是y时匹配成功

负向零宽后发断言 (?<!y)xx左边不是y时匹配成功

例子:
grep -P '(?<!xxx)hello' *.log 此例子为 负向零宽后发断言,当hello的左边不是xxx时匹配成功

断言可用于非常复杂的字符串匹配场景,比如文本内容为一长串URL地址时,或者为其他复杂文本时。

grep总结

grep被誉为Linux下的文本处理三剑客之一,也是三剑客的第三个,它具有很强的文本过滤能力,有些时候不一定要写很复杂的程序才能完成日志分析,其实用很简单的Linux命令就能完成需求,而且效率非常高。grep就是其中之一。

这里的断言并没有深入的介绍,只是简单的说明了一下,举了一个例子。如需深入了解学习断言,可参考下面的几篇文章,写的很好。