常用基础 - grep 内容匹配 ¶
作者:KK
发表日期:2019.03.28
要点速读 ¶
匹配内容的命令是
grep。支持正则:
cat xxx.txt | grep 'aaa.\+[0-9]?end_word$'。正则不能像平时写编程语言的正则那样写,有些符号前要加
\号,不能用\d代表数字,只能用区间[0-9]来表示。匹配后输出前面 5 行和后面 9 行:
cat /etc/nginx/nginx.conf | grep ssl -B 5 -A 9。
需求场景 ¶
一个文件里面有很多内容,我们需要在里面查找涉及某个关键词的内容都是怎样的。
执行一个命令后输出一大堆内容,需要关注里面是否有某个关键词,并且内容是怎样的。
程序日志很大,要从里面搜索指定关键词的日志。
把特定关键词的内容提取出来后交由后面的程序处理。
主要特征就是基于大块内容来查找,如果内容少一眼能看出来的话干嘛还找呢对吧。
基本查找 ¶
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 行的内容。