常用基础 - grep 内容匹配

  • 作者:KK

  • 发表日期:2019.03.28


要点速读

  1. 匹配内容的命令是grep

  2. 支持正则:cat xxx.txt | grep 'aaa.\+[0-9]?end_word$'

  3. 正则不能像平时写编程语言的正则那样写,有些符号前要加\号,不能用\d代表数字,只能用区间[0-9]来表示。

  4. 匹配后输出前面 5 行和后面 9 行:cat /etc/nginx/nginx.conf | grep ssl -B 5 -A 9


需求场景

  1. 一个文件里面有很多内容,我们需要在里面查找涉及某个关键词的内容都是怎样的。

  2. 执行一个命令后输出一大堆内容,需要关注里面是否有某个关键词,并且内容是怎样的。

  3. 程序日志很大,要从里面搜索指定关键词的日志。

  4. 把特定关键词的内容提取出来后交由后面的程序处理。

主要特征就是基于大块内容来查找,如果内容少一眼能看出来的话干嘛还找呢对吧。


基本查找

cat /etc/passwd | grep root就是读出/etc/passwd文件将内容传给grep命令,用这个命令匹配里面涉及“root”的内容,最后会用红色标出来。

总结来说就是grep命令是用于匹配内容的,并且它是按行来匹配的(文件有10行,就每一行都匹配一下,匹配到关键词了就把整行都输出来)。


正则查找

cat /etc/passwd | grep 'root.\+nologin'匹配“root”后带任意字符并且还带有“nologin”一词的内容,结果输出 1 行。

不了解正则可以参考 正则表达式教程,其中grep命令使用的正则符号稍微有些不一样,涉及?+{}<>()这些符号的时候,要在前面加\号,比如上面示例的表达式里就用到了.\+而不是.+,如果不转义的话,会跟 Linux 的 shell 代码冲突并被解析成 shell 脚本里所代表的意义的,最终就会匹配失败。


从文件查找

前面都是通过cat命令读出内容来匹配的,其实也可以从文件直接匹配,只要在命令的最后(参数后面)加上文件路径就可以了:

grep 'root.\+nologin' /etc/passwd


匹配目标的前后几行的内容

有时候我们还要关注匹配行的上面几行和下面几行都是什么内容,可以在grep命令里加上-A(after)和-B(before)参数:

cat /etc/nginx/nginx.conf | grep ssl -B 5 -A 9

这个例子就从nginx的配置里查找ssl相关的配置,并查看它前面 5 行和后面 9 行的内容。