grep、egrep、fgrep、rgrep - 打印匹配模式的行
概要
grep [选项]... 模式 [文件]...
grep [选项]... -e 模式 ... [文件]...
grep [选项]... -f 模式文件 ... [文件]...
描述
grep 在每个文件中搜索模式。 在概要的第一个形式中,如果不存在 -e 或 -f 选项,则第一个操作数“模式”是一或多个模式,由换行符分隔,grep 打印与模式匹配的每一行。 通常,当 grep 在 shell 命令中使用时,应该对“模式”进行引用。
“-”形式的文件表示标准输入。 如果没有指定文件,则递归搜索将检查工作目录,而非递归搜索将读取标准输入。
Debian 还包含变体程序 egrep、fgrep 和 rgrep。 这些程序与 grep -E、grep -F 和 grep -r 分别相同。 这些变体程序在上游中已被弃用,但 Debian 提供以实现向后兼容性。 为了可移植性,建议避免使用变体程序,而是使用带有相关选项的 grep。
选项
通用程序信息
--help 输出用法消息并退出。
-V,--version
输出 grep 的版本号并退出。
模式语法
-E,--extended-regexp
将模式解释为扩展正则表达式(ERE,如下所示)。
-F,--fixed-strings
将模式解释为固定字符串,而不是正则表达式。
-G,--basic-regexp
将模式解释为基本正则表达式(BRE,如下所示)。 这是默认设置。
-P,--perl-regexp
将模式解释为与 Perl 兼容的正则表达式(PCRE)。 当与 -z(--null-data)选项组合使用时,此选项是实验性的,grep -P 可能会警告未实现的功能。
匹配控制
-e 模式,--regexp=模式
使用模式作为模式。 如果此选项多次使用或与 -f(--file)选项组合使用,则搜索给定的所有模式。 此选项可用于保护以“-”开头的模式。
-f 文件,--file=文件
从文件获取模式,每行一个。 如果此选项多次使用或与 -e(--regexp)选项组合使用,则搜索给定的所有模式。 空文件包含零个模式,因此不匹配任何内容。 如果文件为 -,则从标准输入读取模式。
-i,--ignore-case
忽略模式和输入数据中的大小写区分,以便仅在大小写上不同的字符相互匹配。
--no-ignore-case
不要忽略模式和输入数据中的大小写区分。 这是默认设置。 此选项可用于传递给已经使用 -i 的 shell 脚本,以取消其效果,因为这两个选项会相互覆盖。
-v, --invert-match
反转匹配意义,选择不匹配的行。
-w, --word-regexp
仅选择包含构成整个单词的匹配项的那些行。测试是,匹配的子字符串必须位于行的开头,或者前面有一个非单词字符。类似地,它必须位于行的末尾或后面有一个非单词字符。单词字符是字母、数字和下划线。如果也指定了 -x,则此选项无效。
-x, --line-regexp
仅选择完全匹配整行的那些匹配项。对于正则表达式模式,这就像将模式括在括号中,然后在前面和后面加上 ^ 和 $。
通用输出控制
-c, --count
禁止正常输出;而是为每个输入文件打印匹配行的计数。使用 -v 或 --invert-match 选项(见上文)时,计算不匹配的行数。
--color[=WHEN], --colour[=WHEN]
用转义序列包围匹配的(非空)字符串、匹配的行、上下文行、文件名、行号、字节偏移量和分隔符(用于字段和上下文行组),以便在终端上以彩色显示它们。颜色由环境变量 GREP_COLORS 定义。WHEN 可以是 never、always 或 auto。
-L, --files-without-match
禁止正常输出;而是打印每个不应输出任何内容的输入文件的名称。
-l, --files-with-matches
禁止正常输出;而是打印每个应输出内容的输入文件的名称。扫描每个输入文件时,在第一个匹配项处停止。
-m NUM, --max-count=NUM
在读取 NUM 个匹配行后停止读取文件。如果 NUM 为零,grep 立即停止读取输入。如果 NUM 为 -1,则将其视为无穷大,grep 不会停止;这是默认值。如果输入是从常规文件读取的标准输入,并且输出 NUM 个匹配行,则 grep 确保在退出之前,将标准输入定位到最后一个匹配行之后,无论是否存在尾随的上下文行。这使得调用进程可以恢复搜索。当 grep 在输出 NUM 个匹配行后停止时,它会输出任何尾随的上下文行。当同时使用 -c 或 --count 选项时,grep 不会输出大于 NUM 的计数。当同时使用 -v 或 --invert-match 选项时,grep 在输出 NUM 个不匹配的行后停止。
-o, --only-matching
仅打印匹配行中匹配的(非空)部分,并将每个部分放在单独的输出行中。
-q, --quiet, --silent
安静;不向标准输出写入任何内容。如果找到任何匹配项(即使检测到错误),立即以零状态退出。另请参见 -s 或 --no-messages 选项。
-s, --no-messages
抑制关于不存在或无法读取的文件产生的错误消息。
输出行前缀控制
-b, --byte-offset
在每个输出行的前面打印基于零的输入文件中的字节偏移量。如果指定了 -o (--only-matching),则打印匹配部分本身的偏移量。
-H, --with-filename
为每个匹配项打印文件名。当要搜索的文件多于一个时,这是默认设置。这是一个 GNU 扩展。
-h, --no-filename
抑制在输出中添加文件名。当只有一个文件(或只有标准输入)要搜索时,这是默认设置。
--label=LABEL
将实际上来自标准输入的输入显示为来自文件 LABEL 的输入。这对于在搜索之前转换文件内容(例如,gzip -cd foo.gz | grep --label=foo -H 'some pattern')的命令很有用。另请参见 -H 选项。
-n, --line-number
在每行输出的前面添加输入文件中基于 1 的行号。
-T, --initial-tab
确保实际行内容的第一个字符位于制表符停止位置,以便制表符的对齐方式看起来正常。这对于带有在其输出前添加前缀的选项(-H、-n 和 -b)的选项非常有用。为了提高单个文件中所有行都从同一列开始的可能性,这还会导致行号和字节偏移量(如果存在)以最小的字段宽度打印。
-Z, --null
输出零字节(ASCII NUL 字符)而不是通常在文件名后跟随的字符。例如,grep -lZ 在每个文件名后输出零字节,而不是通常的换行符。此选项使输出清晰,即使在文件名包含换行符等不寻常字符时也是如此。此选项可与 find -print0、perl -0、sort -z 和 xargs -0 等命令一起使用,以处理任意文件名,即使这些文件名包含换行符。
上下文行控制
-A NUM, --after-context=NUM
打印匹配行之后的 NUM 行的尾部上下文。在连续的匹配组之间放置包含组分隔符 (--) 的一行。如果指定了 -o 或 --only-matching 选项,则此选项无效,并会发出警告。
-B NUM, --before-context=NUM
打印匹配行之前的 NUM 行的头部上下文。在连续的匹配组之间放置包含组分隔符 (--) 的一行。如果指定了 -o 或 --only-matching 选项,则此选项无效,并会发出警告。
-C NUM, -NUM, --context=NUM
打印 NUM 行的输出上下文。在连续的匹配组之间放置包含组分隔符 (--) 的一行。如果指定了 -o 或 --only-matching 选项,则此选项无效,并会发出警告。
--group-separator=SEP
在使用 -A、-B 或 -C 时,打印 SEP 而不是组线之间的 --。
--no-group-separator
在使用 -A、-B 或 -C 时,不要在组线之间打印分隔符。
文件和目录选择
-a, --text
将二进制文件视为文本文件进行处理;这等效于 --binary-files=text 选项。
--binary-files=TYPE
如果文件的内容或元数据表明该文件包含二进制数据,则假定该文件为 TYPE 类型。非文本字节表示二进制数据;这些要么是当前区域设置中编码不正确的输出字节,要么是在未给出 -z 选项时,是空输入字节。
默认情况下,TYPE 为 binary,并且 grep 在发现空输入二进制数据后会停止输出,并且会停止输出包含编码不正确的行的内容。当部分输出被抑制时,grep 会在标准错误输出中显示一条消息,说明二进制文件匹配。
如果 TYPE 为 without-match,当 grep 发现空输入二进制数据时,它会假定文件的其余部分不匹配;这等效于 -I 选项。
如果 TYPE 为 text,grep 将二进制文件视为文本文件进行处理;这等效于 -a 选项。
当 type 为 binary 时,grep 即使在没有 -z 选项的情况下,也可能将非文本字节视为行尾符。这意味着选择 binary 或 text 可能会影响模式是否与文件匹配。例如,当 type 为 binary 时,模式 q$ 可能会匹配紧接着空字节的 q,即使在 type 为 text 时不匹配。相反,当 type 为 binary 时,模式 .(句点)可能无法匹配空字节。
警告:-a 选项可能会输出二进制垃圾,如果输出到终端并且终端驱动程序将其中一些内容解释为命令,则可能会产生不良后果。另一方面,在读取文本编码未知的文件时,使用 -a 或在环境中设置 LC_ALL='C' 可能会有所帮助,以便找到更多匹配项,即使这些匹配项不适合直接显示。
-D ACTION, --devices=ACTION
如果输入文件是设备、FIFO 或套接字,则使用 ACTION 来处理它。默认情况下,ACTION 为 read,这意味着设备像普通文件一样被读取。如果 ACTION 为 skip,则设备将被静默跳过。
-d ACTION, --directories=ACTION
如果输入文件是目录,则使用 ACTION 来处理它。默认情况下,ACTION 为 read,即像普通文件一样读取目录。如果 ACTION 为 skip,则静默跳过目录。如果 ACTION 为 recurse,则递归读取每个目录下的所有文件,仅当它们位于命令行上时才跟踪符号链接。这等效于 -r 选项。
--exclude=GLOB
跳过命令行中名称后缀与模式 GLOB 匹配的任何文件,使用通配符匹配;名称后缀要么是整个名称,要么是在名称中斜杠(/)之后的非斜杠字符开头的尾随部分。在递归搜索时,跳过其基本名称与 GLOB 匹配的任何子文件;基本名称是最后一个斜杠之后的名称。模式可以使用 *、? 和 [] 作为通配符,并使用 \ 来按字面意义引用通配符或反斜杠字符。
--exclude-from=FILE
跳过其基本名称与从 FILE 读取的文件名模式(使用通配符匹配,如 --exclude 中所述)匹配的任何文件。
--exclude-dir=GLOB
跳过其名称后缀与模式 GLOB 匹配的任何命令行目录。 在递归搜索时,跳过其基本名称与 GLOB 匹配的任何子目录。 忽略 GLOB 中任何多余的尾部斜杠。
-I
将二进制文件视为不包含匹配数据的文件;这等效于 --binary-files=without-match 选项。
--include=GLOB
仅搜索其基本名称与 GLOB 匹配的文件(使用通配符匹配,如 --exclude 中所述)。 如果给定了矛盾的 --include 和 --exclude 选项,则最后一个匹配的选项将生效。 如果没有 --include 或 --exclude 选项匹配,则除非第一个这样的选项是 --include,否则将包含该文件。
-r, --recursive
读取每个目录下的所有文件,递归地读取,仅在命令行上时才跟随符号链接。 请注意,如果没有给定任何文件操作数,grep 将搜索当前工作目录。 这等效于 -d recurse 选项。
-R, --dereference-recursive
读取每个目录下的所有文件,递归地读取。 跟踪所有符号链接,与 -r 不同。
其他选项
--line-buffered
在输出时使用行缓冲。 这可能会导致性能下降。
-U, --binary
将文件视为二进制文件。 默认情况下,在 MS-DOS 和 MS-Windows 下,grep 会猜测文件是文本文件还是二进制文件,如 --binary-files 选项中所述。 如果 grep 确定该文件是文本文件,它会从原始文件内容中删除 CR 字符(以使带有 ^ 和 $ 的正则表达式正常工作)。 指定 -U 将覆盖此猜测,导致所有文件被读取并按原样传递给匹配机制;如果该文件是带有行尾 CR/LF 对的文本文件,这将导致某些正则表达式失败。 此选项对 MS-DOS 和 MS-Windows 以外的平台没有影响。
-z, --null-data
将输入和输出数据视为由零字节(ASCII NUL 字符)而不是换行符分隔的行序列。 类似于 -Z 或 --null 选项,此选项可与 sort -z 等命令一起使用以处理任意文件名。
正则表达式
正则表达式是一种描述字符串集合的模式。 正则表达式类似于算术表达式,通过使用各种运算符组合较小的表达式来构造。
grep 了解三种不同的正则表达式语法:“基本”(BRE)、“扩展”(ERE)和“perl”(PCRE)。 在 GNU grep 中,基本正则表达式和扩展正则表达式只是相同模式匹配功能的不同的表示法。 在其他实现中,基本正则表达式通常比扩展正则表达式功能少,但有时情况正好相反。 以下描述适用于扩展正则表达式;基本正则表达式的差异稍后总结。 Perl 兼容正则表达式具有不同的功能,并在 pcre2syntax(3) 和 pcre2pattern(3) 中进行了记录,但仅在启用 PCRE 支持时才有效。
基本构建块是匹配单个字符的正则表达式。 大多数字符,包括所有字母和数字,都是匹配自身的正则表达式。 可以通过在特殊字符前加上反斜杠来引用具有特殊含义的任何元字符。
句点. 匹配任何单个字符。 是否匹配编码错误未指定。
字符类和方括号表达式
方括号表达式是位于[和]之间的字符列表。 它匹配列表中任何单个字符。 如果列表中的第一个字符是插入符号^,则它匹配列表中不包含的任何字符;是否匹配编码错误未指定。 例如,正则表达式[0123456789]匹配任何单个数字。
在方括号表达式中,范围表达式由两个字符组成,中间用连字符分隔。 在默认的 C 区域设置中,它匹配在 ASCII 顺序中,这两个字符之间(包括两个字符)出现的任何单个字符。 例如,[a-d]等效于[abcd]。 在其他区域设置中,行为未指定:[a-d]可能等效于[abcd]或[aBbCcDd]或其他方括号表达式,或者它可能无法匹配任何字符,或者它匹配的字符集可能是不确定的,或者它可能无效。 要获得方括号表达式的传统解释,可以使用 C 区域设置,方法是将 LC_ALL 环境变量设置为值 C。
最后,在方括号表达式中预定义了某些命名的字符类,如下所示。 它们的名称不言自明,它们是[:alnum:]、[:alpha:]、[:blank:]、[:cntrl:]、[:digit:]、[:graph:]、[:lower:]、[:print:]、[:punct:]、[:space:]、[:upper:]和[:xdigit:]。 例如,[[:alnum:]]表示当前区域设置中数字和字母的字符类。 在 C 区域设置和 ASCII 字符集编码中,这与[0-9A-Za-z]相同。(请注意,这些类名中的方括号是符号名称的一部分,必须包含在分隔方括号表达式的方括号之外。)大多数元字符在方括号表达式中失去了其特殊含义。 要包含文字],请将其放在列表中的第一个位置。 同样,要包含文字^,请将其放在列表中的任何位置,但不要放在第一个位置。 最后,要包含文字-,请将其放在列表的最后一个位置。
锚定
插入符号^和美元符号$是元字符,它们分别匹配行首和行尾的空字符串。
反斜杠字符和特殊表达式
符号\<和\\>分别匹配单词开头的空字符串和单词结尾的空字符串。 符号\b匹配单词边缘的空字符串,而\B匹配空字符串,前提是它不在单词边缘。 符号\w是[_[:alnum:]]的同义词,\W是[^_[:alnum:]]的同义词。
重复
正则表达式后可以跟以下重复运算符之一: ? 前面的项是可选的,最多匹配一次。 * 前面的项将匹配零次或多次。 + 前面的项将匹配一次或多次。 {n} 前面的项将精确匹配 n 次。 {n,} 前面的项将匹配 n 次或更多次。 {,m} 前面的项最多匹配 m 次。这是 GNU 扩展。 {n,m} 前面的项将匹配至少 n 次,但不超过 m 次。
串联
两个正则表达式可以串联;生成的正则表达式匹配通过串联两个子字符串而形成的任何字符串,这些子字符串分别匹配串联的表达式。
交替
两个正则表达式可以用中缀运算符 | 连接;生成的正则表达式匹配与任一交替表达式匹配的任何字符串。
优先级
重复的优先级高于串联,而串联的优先级高于交替。 可以使用括号将整个表达式括起来,以覆盖这些优先级规则并形成子表达式。
反向引用和子表达式
反向引用 \n,其中 n 是单个数字,匹配之前由正则表达式的第 n 个带括号的子表达式匹配的子字符串。
基本与扩展正则表达式
在基本正则表达式中,元字符 ?, +, {, |, (, 和 ) 失去其特殊含义;而是使用反斜杠版本 \?, +, {, |, (, 和 )。
退出状态
通常,如果选择了一行,退出状态为 0;如果没有选择任何行,则为 1;如果发生错误,则为 2。但是,如果使用 -q 或 --quiet 或 --silent 并且选择了一行,则即使发生错误,退出状态也为 0。
环境
以下环境变量会影响 grep 的行为。
通过检查三个环境变量 LC_ALL、LC_foo 和 LANG(按此顺序)来指定 LC_foo 类别的位置。这些变量中的第一个设置的变量将指定位置。例如,如果未设置 LC_ALL,但 LC_MESSAGES 设置为 pt_BR,则将使用巴西葡萄牙语位置来设置 LC_MESSAGES 类别。如果这三个环境变量中没有一个已设置,或者未安装位置目录,或者 grep 未使用国家语言支持 (NLS) 编译,则将使用 C 位置。shell 命令 locale -a 列出了当前可用的位置。
GREP_COLORS
控制 --color 选项如何突出显示输出。其值为冒号分隔的功能列表,默认值为 ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36,并且省略了 rv 和 ne 布尔功能(即,为 false)。支持的功能如下。
sl= SGR 子字符串,用于整个选定的行(即,当省略 -v 命令行选项时,匹配的行;当指定 -v 时,不匹配的行)。但是,如果同时指定了布尔值 rv 和 -v 命令行选项,则它适用于上下文匹配的行。默认值为为空(即,终端的默认颜色对)。
cx= SGR 子字符串,用于整个上下文行(即,当省略 -v 命令行选项时,不匹配的行;当指定 -v 时,匹配的行)。但是,如果同时指定了布尔值 rv 和 -v 命令行选项,则它适用于选定的不匹配行。默认值为为空(即,终端的默认颜色对)。
rv 一个布尔值,当指定 -v 命令行选项时,它会反转(交换)sl= 和 cx= 功能的含义。默认值为 false(即,省略该功能)。
mt=01;31
SGR 子字符串,用于任何匹配行中匹配的非空文本(即,当省略 -v 命令行选项时,选定的行;当指定 -v 时,上下文行)。设置此值等效于同时将 ms= 和 mc= 设置为相同的值。默认值是粗体红色文本前景色,背景色为当前行背景色。
ms=01;31
SGR 子字符串,用于选定行中匹配的非空文本。(仅在省略 -v 命令行选项时使用。)当此功能生效时,sl=(或 cx= 如果 rv)的功能仍然有效。默认值是粗体红色文本前景色,背景色为当前行背景色。
mc=01;31
SGR 子字符串,用于上下文行中匹配的非空文本。(仅在指定 -v 命令行选项时使用。)当此功能生效时,cx=(或 sl= 如果 rv)的功能仍然有效。默认值是粗体红色文本前景色,背景色为当前行背景色。
fn=35 SGR 子字符串,用于任何内容行之前的文件名。默认值是品红色文本前景色,背景色为终端的默认背景色。
ln=32 SGR 子字符串,用于任何内容行之前的行号。默认值是绿色文本前景色,背景色为终端的默认背景色。
bn=32 SGR 子字符串,用于任何内容行之前的字节偏移量。默认值是绿色文本前景色,背景色为终端的默认背景色。
se=36 SGR 子字符串,用于插入到选定行字段(:)之间、上下文行字段(-)之间以及当指定非零上下文时,相邻行组之间(--)。默认值是青色文本前景色,背景色为终端的默认背景色。
ne 一个布尔值,用于防止每次着色项目结束时都使用行尾擦除 (EL) 命令清除到行尾。这对于不支持 EL 命令的终端是必需的。否则,对于不适用背景颜色擦除 (bce) 布尔终端信息功能,或者当所选高亮颜色不影响背景时,或者当 EL 太慢或导致太多闪烁时,它也很有用。默认值为 false(即,省略该功能)。
请注意,布尔值功能没有 =... 部分。 它们默认情况下会被省略(即,为 false),并在指定时变为 true。
请参阅所使用的文本终端文档中的“选择图形渲染 (SGR)”部分,以了解允许的值及其作为字符属性的含义。 这些子字符串值是十进制表示形式的整数,可以用分号连接。 grep 会负责将结果组合成完整的 SGR 序列(\33[...m)。 常见的用于连接的值包括:1 表示粗体,4 表示下划线,5 表示闪烁,7 表示反转,39 表示默认前景色,30 到 37 表示前景色,90 到 97 表示 16 色模式下的前景色,38;5;0 到 38;5;255 表示 88 色和 256 色模式下的前景色,49 表示默认背景色,40 到 47 表示背景色,100 到 107 表示 16 色模式下的背景色,以及 48;5;0 到 48;5;255 表示 88 色和 256 色模式下的背景色。
^ C_ALL, LC_COLLATE, LANG
这些变量指定 LC_COLLATE 类别的位置,它确定用于解释类似 [a-z] 的范围表达式的排序顺序。
^ C_ALL, LC_CTYPE, LANG
这些变量指定 LC_CTYPE 类别的位置,它确定字符的类型,例如哪些字符是空格。 此类别还确定字符编码,即文本是编码为 UTF-8、ASCII 还是其他编码。 在 C 或 POSIX 位置中,所有字符都编码为单个字节,并且每个字节都是一个有效的字符。
^ C_ALL, LC_MESSAGES, LANG
这些变量指定 LC_MESSAGES 类别的语言,grep 使用该语言来显示消息。 默认的 C 位置使用美国英语消息。
^ OSIXLY_CORRECT
如果设置,grep 的行为符合 POSIX 的要求;否则,grep 的行为更像其他 GNU 程序。 POSIX 要求,文件名之后跟随的选项必须被视为文件名;默认情况下,这些选项会被移动到操作数列表的前面,并被视为选项。 此外,POSIX 要求将未识别的选项诊断为“非法”,但由于它们实际上并不违法,因此默认情况下将其诊断为“无效”。
备注
本手册页仅偶有维护;完整的文档通常是最新的。
版权
版权所有,1998–2000、2002、2005–2025,自由软件基金会。
这是自由软件;请参阅源代码以获取复制条件。 不提供任何保修,即使是针对特定目的的适用性和适用性。
错误
报告错误
将错误报告发送到错误报告地址。提供了一个电子邮件存档和一个错误跟踪器。
已知错误
在 {n,m} 结构中使用大量重复次数可能会导致 grep 使用大量内存。此外,某些其他晦涩的正则表达式需要指数级的时间和空间,并且可能导致 grep 耗尽内存。
反向引用非常慢,并且可能需要指数级的时间。
示例
以下示例输出包含“f”且以“.c”结尾的任何行的位置和内容,搜索对象为当前目录中文件名包含“g”且以“.h”结尾的所有文件。-n 选项输出行号,-- 参数将以“*g*.h”开头的“-”作为文件名而不是选项进行扩展,并且空文件 /dev/null 即使只有一个文件名形式为“*g*.h”,也会导致输出文件名。
$ grep -n -- 'f.*\.c$' *g*.h /dev/null
argmatch.h:1:/* definitions and prototypes for argmatch.c
唯一匹配的行是 argmatch.h 的第 1 行。请注意,模式中使用的正则表达式语法与 shell 用于匹配文件名的 globbing 语法不同。
参见
完整的手册页
awk(1), cmp(1), diff(1), find(1), perl(1), sed(1), sort(1), xargs(1), read(2), pcre2(3), pcre2syntax(3), pcre2pattern(3), terminfo(5), glob(7), regex(7)
完整文档
提供完整的文档。如果 info 和 grep 程序在您的站点中正确安装,则命令
info grep
应该可以访问完整的文档。