grep
是 Linux 系统中的内容搜索命令。不同于 find
命令只能搜索文件名和属性数据,grep
可以对文件内容进行准确的匹配和定位,比如搜索的文本位于文件的第几行;这对于写代码的编程场景来说十分有用。
grep 命令格式
grep [选项...] PATTERN [文件...]
Grep 以文件或是标准输入为搜索来源,并根据选项和 PATTERN 定义来输出匹配的内容。PATTERN 定义可以为文本,也可以为正则表达式。
此命令有两个变种:Egrep 和 Fgrep。Egrep 与 grep -E
相同。Fgrep 与 grep -F
相同。
grep 命令示例
在 /etc/passwd 文件中搜索包含 zzxworld 字符串的行:
grep zzxworld /etc/passwd
在 /etc/ 目录中查找所有文件,找出包含 zzxworld 字符串的文件和内容行:
grep zzxworld /etc/*
上面的命令只会搜索一层目录,如果要递归搜索其子目录,需要使用 -r
选项:
grep -r zzxworld /etc/
匹配到内容的同时输出行号:
grep -n zzxworld /etc/passwd
搜索以字符 z 开头的行:
grep '^z' /etc/passwd
搜索不包含 nologin
的行:
grep -v nologin /etc/passwd
搜索包含 zzxworld 或是 www 字符串的行:
grep 'zzxworld\|www' /etc/passwd
只在 .php 后缀的文件中搜索 Laravel 字符串:
grep -r --include="*.php" Laravel ./
在排除 .php 后缀文件的前提下搜索 Laravel 字符串:
grep -r --exclude="*.php" Laravel ./
grep 命令选项
缩写 | 完整名称 | 说明 |
---|---|---|
-A NUM |
--after-context= NUM |
打印出紧随匹配的行之后的下文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。 |
-a |
--text |
将一个二进制文件视为一个文本文件来处理;它与 --binary-files=text 选项等价。 |
-B NUM |
--before-context= NUM |
打印出匹配的行之前的上文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。 |
-C NUM |
--context= NUM |
打印出匹配的行的上下文前后各 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。 |
-b |
--byte-offset |
在输出的每行前面同时打印出当前行在输入文件中的字节偏移量。 |
--binary-files= TYPE |
如果一个文件的起始几个字节表明文件包含二进制数据,那么假定文件是 TYPE 类型的。默认情况下,TYPE 是 binary ,并且 grep 一般会输出一个一行的消息说一个二进制文件匹配,或者如果没有匹配的话就没有消息输出。如果类型 TYPE 是 without-match ,那么 grep 假定二进制文件不会匹配;这样做与 -I 选项等价。如果类型 TYPE 是 text ,那么 grep 将一个二进制文件视为文本文件来处理;它与 -a 选项等价。 警告:grep --binary-files=text 可能会输出二进制的无用内容。如果输出设备是一个终端,并且终端的驱动将这些输出中的一些当作命令,可能会带来恶劣的副作用。 |
|
--colour [=WHEN] |
--color[=WHEN] 在匹配的行周围以 GREP_COLOR 环境变量中指定的记号来标记。WHEN 可以是 never , always , 或是 auto 。 |
|
-c |
--count |
禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。如果使用 -v , --invert-match 选项 (参见下面),将是不匹配的行的总数。 |
-D ACTION |
--devices= ACTION |
如果输入文件是一个设备,FIFO 或是套接字(socket),使用动作 ACTION 来处理它。默认情况下,动作 ACTION 是 read ,意味着设备将视为普通文件那样来读。如果动作 ACTION 是 skip ,将不处理而直接跳过设备。 |
-d ACTION |
--directories= ACTION |
如果输入文件是一个目录,使用动作 ACTION 来处理它。默认情况下,动作 ACTION 是 read ,意味着目录将视为普通文件那样来读。如果动作 ACTION 是 skip ,将不处理而直接跳过目录。如果动作 ACTION 是 recurse , grep 将递归地读每一目录下的所有文件。这样做和 -r 选项等价。 |
-E |
--extended-regexp |
将模式 PATTERN 作为一个扩展的正则表达式来解释。 |
-e PATTERN |
--regexp= PATTERN |
使用模式 PATTERN 作为模式;在保护以 - 为起始的模式时有用。 |
-F |
--fixed-strings |
将模式 PATTERN 视为一个固定的字符串的列表,用新行 (newlines) 分隔,只要匹配其中之一即可。 |
-P |
--perl-regexp |
将模式 PATTERN 作为一个 Perl 正则表达式来解释。 |
-f FILE |
--file= FILE |
从文件 FILE 中获取模式,每行一个。空文件含有 0 个模式,因此不匹配任何东西。 |
-G |
--basic-regexp |
将模式 PATTERN 作为一个基本的正则表达式来解释。这是默认值。 |
-H |
--with-filename |
为每个匹配打印文件名。 |
-h |
--no-filename |
当搜索多个文件时,禁止在输出的前面加上文件名前缀。 |
--help |
输出一个简短的帮助信息。 | |
-I |
处理一个二进制文件,但是认为它不包含匹配的内容。这和 --binary-files=without-match 选项等价。 |
|
-i |
--ignore-case |
忽略模式 PATTERN 和输入文件中的大小写的分别。 |
-L |
--files-without-match |
禁止通常的输出;作为替代,打印出每个在通常情况下不会产生输出的输入文件的名字。对每个文件的扫描在遇到第一个匹配的时候就会停止。 |
-l |
--files-with-matches |
禁止通常的输出;作为替代,打印出每个在通常情况下会产生输出的输入文件的名字。对每个文件的扫描在遇到第一个匹配的时候就会停止。 |
-m NUM |
--max-count= NUM |
在找到 NUM 个匹配的行之后,不再读这个文件。如果输入是来自一个普通文件的标准输入,并且已经输出了 NUM 个匹配的行, grep 保证标准输入被定位于退出时的最后一次匹配的行之后,不管是否指定了要输出紧随的下文的行。这样可以使一个调用程序恢复搜索。当 grep 在 NUM 个匹配的行之后停止,它会输出任何紧随的下文的行。当使用了 -c 或 --count 选项的时候, grep 不会输出比 NUM 更多的行。当指定了 -v 或 --invert-match 选项的时候, grep 会在输出 NUM 个不匹配的行之后停止。 |
--mmap |
如果可能的话,使用 mmap 系统调用来读取输入,而不是默认的 read 系统调用。在一些情况下,--mmap 提供较好的性能。但是,如果一个输入文件在 grep 正在操作时大小发生变化,或者如果发生了一个 I/O 错误, --mmap 可能导致不可知的行为 (包括core dumps)。 |
|
-n |
--line-number |
在输出的每行前面加上它所在的文件中它的行号。 |
-o |
--only-matching |
只显示匹配的行中与 PATTERN 相匹配的部分。 |
--label= LABEL |
将实际上来自标准输入的输入视为来自输入文件 LABEL。这对于 zgrep 这样的工具非常有用,例如: gzip -cd foo.gz | grep --label=foo something |
|
--line-buffering |
使用行缓冲,使用这个选项会存在性能损失。 | |
-q |
--quiet , --silent |
静默执行。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值 0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。 |
-R , -r |
--recursive |
递归地读每一目录下的所有文件。这样做和 -d recurse 选项等价。 |
--include= PATTERN |
仅仅在搜索匹配 PATTERN 的文件时在目录中递归搜索。 | |
--exclude= PATTERN |
在目录中递归搜索,但是跳过匹配 PATTERN 的文件。 | |
-s |
--no-messages |
禁止输出关于文件不存在或不可读的错误信息。对于可移植性需要注意:与 GNU grep 不同,传统的 grep 不遵守 POSIX.2 规范,因为传统的 grep 缺少一个 -q 选项,而它的 -s 选项与 GNU grep 的 -q 选项行为相似。需要可移植到传统 grep 的 shell 脚本应当避免使用 -q 和 -s 选项,而应当将输出重定向到 /dev/null 。 |
-U |
--binary |
将文件视为二进制。默认情况下,在 MS-DOS 和 MS-Windows 系统中, grep 通过从文件中读取头部的 32kB 内容来判断它的文件类型。如果 grep 判断文件是一个文本文件,它将原始文件内容中的 CR 字符去除 (使得含有 ^ 和 $ 的正则表达式可以正常工作)。指定 -U 将不进行这些工作,而使所有文件保持不变地读取并传递给匹配机制。如果文件是一个以 CR/LF 换行的文本文件,这样作将导致一些正则表达式失败。这个选项在 MS-DOS 和 MS-Windows 之外的系统中无效。 |
-u |
--unix-byte-offsets |
报告 Unix 风格的字节偏移量。这个开关使得 grep 报告字节偏移量时,将文件作为 Unix 风格的文本文件看待,也就是说将 CR 字符去掉。这将产生与在一台 Unix 主机上运行 grep 完全相同的结果。除非同时使用 -b 选项,否则这个选项无效。这个选项在 MS-DOS 和 MS-Windows 之外的系统中无效。 |
-V |
--version |
向标准错误输出打印 grep 的版本号。版本号应当包含在所有的 bug 报告中 (参见下面)。 |
-v |
--invert-match |
改变匹配的意义,只选择不匹配的行。 |
-w |
--word-regexp |
只选择含有能组成完整的词的匹配的行。判断方法是匹配的子字符串必须是一行的开始,或者是在一个不可能是词的组成的字符之后。与此相似,它必须是一行的结束,或者是在一个不可能是词的组成的字符之前。词的组成字符是字母,数字,还有下划线。 |
-x |
--line-regexp |
只选择能匹配完整一行的匹配。 |
-Z |
--null |
输出一个全零字节 (ASCII 码中的 NUL 字符) 而不是一般情况下输出在文件名之后的字符。例如,grep -lZ 在每个文件名之后输出一个全零字节而不是普通的新行符。这个选项使得输出清楚明白,即使文件名的表示中包含特殊字符比如新行符。这个选项可以与命令 find -print0 , perl -0 , sort -z , 和 xargs -0 一起使用,来处理任意的文件名,即使是那些含有新行符的文件名。 |