grep 是一个功能强大的 unix 命令,可以在文件内容中搜索各种参数。在各种故障排除或调试中特别有用。
grep 有很多选项和使用场景,你应该不会全部都用得到,不过,其中有几个 grep 命令还是经常会用到的。
本文会举例说明一些最常见的 grep 命令,介绍其常见选项及用法。
如下表列出了一些常见的选项及其说明:
选项 |
例子 |
说明 |
i |
grep -i pattern file |
不区分大小写的搜索 |
A |
grep -A n pattern file |
显示搜索的后几行 |
B |
grep -B n pattern file |
显示搜索的前几行 |
C |
grep -C n pattern file |
显示搜索的前几行和后几行 |
v |
grep -v pattern file |
显示不匹配的行 |
c |
grep -c pattern file |
计算匹配的行数 |
l |
grep -l pattern file |
只显示搜索到的文件名称 |
w |
grep -w pattern file |
全字匹配 |
e |
grep -e regex file |
匹配正则表达式 |
a |
grep -a pattern file |
在二进制文件中搜索 |
r |
grep -r pattern dir |
递归搜索目录 |
grep 命令实例
你可能已经知道,要搜索文件中特定的文本或表达式,可以这样使用grep:
grep search_pattern filename
现在我们看看几个常见的例子
不区分大小写的搜索
默认情况下,grep 是区分大小写的。你可以使用 -i 选项来让其不区分大小写:
grep -i search_pattern filename
显示匹配文本的前后行
默认情况下,你只会看到匹配文本的当前行。但是,当你在排除故障的时候,看一下匹配行的前一行,或者后一行,也会有帮助。
你可以使用 -A 来显示匹配行之后的行。记住,A代表之后(After)。
下面的命令将显示匹配的行以及匹配后的5行:
grep -A 5 search_pattern filename
类似地,你可以使用 -B 选项在匹配的行之前显示行。记住,B代表之前(Before)。
下面的命令将在匹配行之前显示5行以及匹配行:
grep -B 5 search_pattern filename
我最喜欢的是选项 -C,因为它显示了匹配行之前和之后的行。C 代表圆(Circle)。
下面的命令将显示匹配行之前的5行、匹配行和匹配行之后的5行:
grep -C 5 search_pattern filename
显示不匹配的行
你可以使用 grep 显示与给定表达式不匹配的所有行。此“反向匹配”使用 -v 选项:
grep -v search_pattern filename
你可以将 -i 和 -v 一起使用。
计算匹配行的数量
使用 -c 选项,可以不显示匹配的行,只显示与给定表达式匹配的行的数量。注意,这里的 c 是小写的 c。
grep -c search_pattern filename
你可以将 -c 和 -v 选项一起用来查看与给定表达式不匹配的行数。当然,也可以结合使用不区分大小写的 -i 选项。
显示匹配行的行号
要显示匹配行的行号,可以使用 -n 选项。
grep -n search_pattern filename
显示行号也可以使用 -v 来进行反向搜索。
在多个文件中搜索
可以给出多个文件进行 grep 搜索:
grep search_pattern file1 file2
这样搜索是可以的。但平时更实用也更常用的,是搜索特定类型的文件,比如只搜索shell脚本(以 .sh 结尾的文件),可以这样使用 grep 命令:
grep search_pattern *.sh
递归搜索目录中的所有文件
你可以使用 -r 选项执行递归搜索,它会在当前目录以及子目录的所有文件中搜索给定的表达式:
grep -r search_pattern directory_path
仅显示文件名
默认情况下,grep 显示匹配的行。如果你已经在多个文件上运行了搜索,并且只想查看哪些文件包含字符串,那么可以使用 -l 选项。
grep -l search_pattern files_pattern
比如你要在所有.md文件中搜索单词 “handbook”,可以这样:
grep -l handbook *.md
全字符匹配(搜索完整单词)
默认情况下,grep 将显示包含给定字符串的任何行。你可能并不总是想要这样,比如你正在搜索“done”一词,它的结果还会显示包含“doner”或“abandoned”的行。
要使用全字符匹配 ,可以使用 -w 选项:
grep -w search_string file
这样,搜索单词 “done” 的时候,就只显示包含 “done” 的行,而不会显示包含 “doner” 或 “abandoned” 的行。
按正则表达式搜索
你可以使用正则表达式来搜索,选项 -e 可以允许使用正则表达式,另外一个选项 -E 允许使用扩展的正则表达式。
grep -e regex_pattern file
使用 “或运算符” |
你可以在同一个 grep 搜索中使用多个表达式,如果要搜索包含“表达式1”,或者“表达式2”的行,可以使用“或(OR)” 运算符 |,但是需要添加反斜线进行转义:
grep 'pattern1\|pattern' filename
AND运算符没有特定选项。为此,你可以多次使用 grep 和管道重定向。
搜索二进制文件
默认情况下,grep 会忽略二进制文件。你可以使用 -a 选项使其在二进制文件中搜索,就像它是文本文件一样:
grep -a pattern binary_file