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/\1rs,loveable替换为lovers。1表示第一组括号
&:保留搜索字符,用来替换其他字符。s/love/*&*/结果为*love*
\<:匹配单词开头
\>:匹配单词结尾。/love\>/包含以love结尾的单词
x\{m\}:重复字符x出现m次。/a\{3\}/表示包含3个a的行
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)x
当x的左边是y时匹配成功
负向零宽先行断言 x(?!y)
x右边不是y时匹配成功
负向零宽后发断言 (?<!y)x
x左边不是y时匹配成功
例子:
grep -P '(?<!xxx)hello' *.log
此例子为 负向零宽后发断言,当hello的左边不是xxx时匹配成功
断言可用于非常复杂的字符串匹配场景,比如文本内容为一长串URL地址时,或者为其他复杂文本时。
grep总结
grep被誉为Linux下的文本处理三剑客之一,也是三剑客的第三个,它具有很强的文本过滤能力,有些时候不一定要写很复杂的程序才能完成日志分析,其实用很简单的Linux命令就能完成需求,而且效率非常高。grep就是其中之一。
这里的断言并没有深入的介绍,只是简单的说明了一下,举了一个例子。如需深入了解学习断言,可参考下面的几篇文章,写的很好。
本文详细介绍了grep命令的功能,包括其语法、参数、正则表达式及高级用法。grep是Linux下强大的文本过滤工具,适用于日志分析等场景,通过丰富的案例展示了如何高效使用grep进行文本搜索。
1586






