Grep 是 Global Regular expression Print 的缩写,它搜索指定文件的内容,匹配指定的模式,默认情况下输出匹配内容所在的行。注意,grep 只支持匹配而不能替换匹配到的内容。
grep 支持不同的匹配模式,比如默认的BRE模式,增强型的ERE模式,还有更强悍的 PRE 模式。普通情况下使用默认的 BRE(basic regular expression) 模式就可以了,这种方式的特点是支持的正则表达式语法有限。如果需要更进一步的正则表达式语法支持,可以使用 ERE(extended regular expression) 模式。如果要使用复杂的正则表达式语法,可以使用 PRE 模式,它支持 Perl 语言的正则表达式语法。
默认情况下 grep 会匹配指定定文件中的内容,如果我们指定了一个目录,grep 则直接罢工:
如果我们只想查看匹配到的内容所在文件的名称,可以同时使用 r 和-l, --files-with-matches选项:
可以在应用选项 r 的同时应用--exclude-dir选项来排除一些目录(注意,这里设置的也是正则表达式):
可以在应用选项 r 的同时应用--exclude选项来排除一些文件(注意,这里采用的是 GLOB模式):
Grep 默认的匹配规则区分字符的大小写,使用选项 -i (小写字母i), --ignore-case 会在匹配中忽略字符大小写:
Grep 默认会输出匹配到的内容所在的整个行,使用选项-o, --only-matching则只输出匹配到的内容:
在需要把匹配的内容存入变量时 -o 选项非常有用,比如下面的示例把从文件中匹配到的 IP 地址保存在变量 ip 中:
当然,我们还可以通过选项 F 来优美的解决这个问题,此时指定的条件会被当成一个字符串来匹配:
使用选项-A n可以输出匹配行后的 n 行,结合 ps 命令,可以用来查找某个进程的子进程。下面的例子通过 -A 1 输出容器运行的进程(bash):
有时我们想要看到匹配行的前后行的内容,使用选项 -C n 可以实现这个功能,比如下面的命令会同时输出匹配行前后 1 行的内容:
如果我们想要获取正则表达式没有匹配到的行,可以使用选项-v, --invert-match:
如果我们只对一个完整的行感兴趣,可以使用选项-x, --line-regexp。这样会忽略那些包含在行中的内容:
如果正则表达式太长,或者是需要指定多个正则表达式,可以把它们放在文件中,然后使用 选项-f FILE, --file=FILE来指定这个文件。如果指定了多个正则表达式(每行一个),任何一个匹配到的结果都会被输出:
与 BRE 相比 ERE 最大的优点是支持更多的元字符,也就是在使用这些字符时不需要 \ 了。比如上面 BRE 中使用的 \ 符可以全部去掉。

