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
就是其中之一。
这里的断言并没有深入的介绍,只是简单的说明了一下,举了一个例子。如需深入了解学习断言,可参考下面的几篇文章,写的很好。