常用基础 - 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 行的内容。