「grep(1)」- 打印与指定模式匹配的行

  LINUX MANUAL PAGES

常用命令

仅仅高亮 somestring 字符串,但不过滤:

grep -E "^|somestring" "/path/to/file"

查找并输出不包含 somestring 的文件:

grep --files-without-match "somestring" "/path/to/file"

仅打印匹配表达式的内容,而不是整行内容:

grep --only-matching "somestring" "/path/to/file"

# 仅打印匹配正则表达式的部分,这里使用 -P, --perl-regexp 选项
grep --only-matching -P '(?<=foo )\w+(?= bar)' test.txt

仅打印匹配的内容,而不输出文件名:

# find ./ -type f -name '*.txt' -print0 | xargs -0 grep 'somestring'
./awk/gawk-4.1.3(1).txt:somestring
./awk/gawk.txt:somestring
./awk/awk(1).txt:somestring

# find ./ -type f -name '*.txt' -print0 | xargs -0 grep 'somestring' --no-filename
somestring
somestring
somestring

语法格式

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]

命令描述

命名grep在输入文件FILE中搜索包含与给定PATTERN匹配的行。如果未指定文件,或者给出文件“-”,则grep从标准输入读取数据进行搜索。默认情况下,命令grep会打印匹配的行。

变体程序egrep、fgrep、rgrep分别等同于使用了-E,-F,-r选项的grep(1)命令。

命令选项

匹配选择

-E, –extended-regexp
PATTERN解释为扩展正则表达式(ERE,见下文)。

-G, –basic-regexp
PATTERN解释为基本正则表达式(BRE,见下文)。这是默认值。

-F, –fixed-strings
PATTERN解释为固定字符串列表(而不是正则表达式),由换行符分隔,其中任何一个都要匹配。

-P, –perl-regexp
PATTERN解释为Perl兼容的正则表达式(PCRE)。这是高度实验性的功能,使用grep -P可能会警告未实现的功能。

匹配控制

-e PATTERN, –regexp=PATTERN
使用PATTERN作为模式。如果多次使用此选项,或与-f(–file)选项组合使用,请搜索给定的所有模式。

此选项可用于保护以“-”开头的模式。

-f FILE, –file=FILE
从FILE获取PATTERN,每行一个。如果多次使用此选项,或与-e(–regexp)选项组合使用,请搜索给定的所有模式。空文件包含零模式,因此不匹配任何内容。

-i, –ignore-case
忽略 PATTERN 和输入文件中的大小写区别。

-v, –invert-match
反转匹配结果,即选择不匹配的行。

-w, –word-regexp
仅选择包含构成整个“单词”的匹配项的行。测试是匹配的子字符串必须位于行的开头,或者前面是非单词构成字符。同样,它必须位于行尾或后跟非单词构成字符。构成“单词”的字符是字母、数字、下划线。

如果还指定了-x,则此选项无效。

-x, –line-regexp
仅选择与整行完全匹配的匹配项。对于正则表达式模式,这就像括号模式,然后用^和$包围它。

-y
已过时,与-i同义词。

一般输出控制

-c, –count
抑制正常输出;而是为每个输入文件打印匹配行的计数。使用-v(–inverse-match)则计算不匹配的行。

–color[=WHEN], –colour[=WHEN]
将匹配的(非空)字符串、匹配的行、上下文行、文件名、行号、字节偏移、分隔符(对于字段和上下文行组)使用“转义序列”进行围绕,这些“序列”使它们在终端上以彩色显示。

颜色由环境变量GREP_COLORS定义。仍然支持已弃用的环境变量GREP_COLOR,但其设置没有优先级。

参数WHEN的取值可以是:never, always, auto

-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选项时,在输出NUM个不匹配行后grep停止。

-o, –only-matching
仅打印匹配行的匹配(非空)部分,每个此匹配的部分会在单独的行上输出。

-q, –quiet, –silent
安静;不要在标准输出上写任何东西。如果发现任何匹配,则立即退出零状态,即使检测到错误也是如此 另请参阅-s或–no-messages选项。

-s, –no-messages
抑制与不存在或不可读文件有关的错误消息。

输出行前缀控制

-b, –byte-offset
在每行输出之前,打印在输入文件中从0开始的字节偏移量。如果指定了-o(–only-matching),则打印匹配部分本身的偏移量。

-H, –with-filename
打印每个匹配的文件名。当有多个要搜索的文件时,这是默认设置。

-h, –no-filename
禁止输出中的文件名前缀。当只有一个文件(或仅标准输入)要搜索时,这是默认值。

–label=LABEL
显示实际来自标准输入的输入作为来自文件LABEL的输入。这在实现像zgrep这样的工具时特别有用,例如gzip -cd foo.gz | grep –label=foo -H something

另请参见-H选项。

-n, –line-number
在输入文件中使用基于“1”的行号,为每行输出添加对应的行号前缀。

-T, –initial-tab
确保实际行内容的第一个字符位于制表位上,以便制表符的对齐方式看起来正常。这对于将其输出前缀为实际内容的选项很有用:-H,-n,-b。为了提高单个文件中的行全部从同一列开始的概率,这也会导致行号和字节偏移量(如果存在)以最小大小的字段宽度打印。

-u, –unix-byte-offsets
报告Unix风格的字节偏移量。此开关使grep报告字节偏移,就好像该文件是Unix风格的文本文件,即剥离了CR字符。这将产生与在Unix机器上运行grep相同的结果。

除非同时使用-b选项,否则此选项无效;该选项对MS-DOS和MS-Windows以外的平台没有影响。

-Z, –null
输出零字节(NUL),而不是通常跟随文件名的字符。例如,grep -lZ在每个文件名后输出一个零字节(NUL),而不是通常的换行符(LF)。

即使存在包含不常用字符(如换行符)的文件名,此选项也会使输出明确无误。此选项可与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行和后NUM行。在连续的匹配组之间放置一个包含组分隔符(–)的行。使用-o或–only-matching选项,这不起作用并给出警告。

文件和目录选择

-a, –text
将二进制文件视为文本文件进行处理。与–binary-files=text等同。

-I
如果文件为处理二进制文件,则假设它不包含匹配数据,直接忽略。与–binary-files=without-match等同。

–binary-files=TYPE
使用该选项后,如果文件的数据或元数据指示文件包含二进制数据,则假定该文件的类型为TYPE。“非文本字节”表示二进制数据;这些是为当前语言环境不正确编码的输出字节,或者在未给出-z选项时的NUL输入字节。

如果TYPE是“binary”(默认情况下),当grep发现文件是二进制时,它会抑制任何进一步的输出,而是输出一行表示二进制文件匹配的消息,或者如果没有匹配则不输出消息。

如果TYPE是“without-match”,当grep发现文件是二进制时,它假定文件的其余部分不匹配;这相当于-I选项。

如果TYPE是“text”,则grep处理二进制文件,就好像它是文本文件一样;这相当于-a选项。

当TYPE是“binary”时,即使没有-z选项,grep也可以将非文本字节视为行终止符。这意味着选择二进制与文本可以影响模式是否与文件匹配。例如,当TYPE为“binary”时,模式q$可能匹配q后紧跟一个NUL字节,即使当TYPE是“text”时这是不匹配的。相反,当TYPE是“binary”模式时句点(.)可能与NUL字节不匹配。

警告:-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选项。

-r, –recursive
递归地读取每个目录下的所有文件。符号链接只有在命令行上时,才能被遵循。请注意,如果没有给出文件操作数,grep将搜索工作目录。与-d recurse等价。

-R, –dereference-recursive
递归地读取每个目录下的所有文件。跟随所有符号链接,与-r不同。

–exclude=GLOB
使用通配符匹配,跳过“名称后缀”与模式GLOB匹配的任何命令行指定的文件;“名称后缀”可以是整个名称,也可以是在/之后和非/之前开始的任何后缀。在递归搜索时,跳过任何基本名称与GLOB匹配的子文件;基本名称是最后一个/之后的部分。模式可以使用*,?,[…]作为通配符,而\可以引用通配符或反斜杠字符。

–exclude-from=FILE
跳过基本名称与从FILE读取的任何文件名GLOB匹配的文件(使用–exclude中描述的通配符匹配)。

–exclude-dir=GLOB
跳过任何命名行目录,其名称后缀与模式GLOB匹配。在递归搜索时,跳过任何基本名称与GLOB匹配的子目录。忽略GLOB中的任何冗余尾部斜杠。

–include=GLOB
仅搜索基本名称与GLOB匹配的文件(使用–exclude中所述的通配符匹配)。

其他选项

–line-buffered
在输出上使用行缓冲。这可能会导致性能下降。

-U, –binary
将文件视为二进制文件。默认情况下,在MS-DOS和MS-Windows下,命令grep会根据–binary-files选项的描述猜测文件是文本还是二进制文件。如果grep决定文件是文本文件,它会从原始文件内容中删除CR字符(使正则表达式使用“^”和“$”正确工作)。指定-U否决了这种猜测,导致所有文件被读取并逐字传递给匹配机制;如果文件是每行末尾带有CR/LF对的文本文件,则会导致某些正则表达式失败。此选项对MS-DOS和MS-Windows以外的平台没有影响。

-z, –null-data
将输入和输出数据视为行序列,每行以零字节(NUL)而不是换行符(LF)结束。与-Z或–null选项类似,此选项可与sort -z等命令一起使用以处理任意文件名。

通用选项

–help
显示帮助信息并退出。

-V, –version
显示版本信息并退出。

正则表达式

正则表达式是描述一组字符串的模式。正则表达式与算术表达式类似地构造,通过使用各种运算符来组合较小的表达式。

grep理解正则表达式语法的三种不同版本:“基本正则表达式”(BRE),“扩展正则表达式”(ERE),“Perl兼容正则表达式”(PCRE)。在GNU的grep中,BRE和ERE之间的可用功能没有区别。在其他实现中,基本正则表达式不太强大。以下描述适用于ERE;之后总结了BRE的差异。PCRE提供了额外的功能,并记录在pcresyntax(3)和pcrepattern(3)中,但仅当PCRE在系统中可用时才有效。

“基本构建块”是与单个字符匹配的正则表达式。大多数字符,包括所有字母和数字,都是与自身匹配的正则表达式元字符。具有特殊含义的任何元字符可以通过在其前面加上反斜杠(\)来引用。

句号(.)匹配任何单个字符。

字符类和括号表达式

括号表达式,由“[”和“]”括起来的字符列表。它匹配该列表中的任何单个字符;如果列表的第一个字符是插入符号(^),那么它匹配列表中没有的任何字符。例如,正则表达式[0123456789]匹配任何单个数字。

范围表达式,是括号表达式的一种,由两个用连字符分隔的字符组成。它使用区域设置的整理顺序和字符集匹配在两个字符之间进行排序的任何单个字符。例如,在默认的C语言环境中,[a-d]等同于[abcd]。许多语言环境按字典顺序对字符进行排序,在这些语言环境中[a-d]通常不等同于[abcd];例如,它可能等同于[aBbCcDd]。要获得括号表达式的传统解释,可以通过设置环境变量LC_ALL=C来使用C语言环境。

字符类,是预定义在括号表达式中的某些命名的字符类,如下所示。他们的名字是自我解释的,他们是[:alnum:], [:alpha:], [: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个带括号的子表达式匹配的子字符串。

BRE vs ERE

在BRE中,元字符?, +, {, |, (, )失去了它们的特殊含义;而是应该使用反斜杠版本\?, \+, \{, \|, \(, \)

注意事项

{n,m}构造中的大量重复计数可能导致grep使用大量内存。此外,某些其他模糊的正则表达式需要指数时间和空间,并且可能导致grep耗尽内存。

反向引用非常慢,可能需要指数时间。

此手册页仅保持适当;完整的文档通常是最新的。

相关环境变量

命令grep的行为受以下环境变量的影响。

通过按顺序检查三个环境变量LC_ALL,LC_foo,LANG来指定类别LC_foo的区域设置。这些设置的第一个变量的值指定了语言环境。例如,如果未设置LC_ALL,但LC_MESSAGES设置为pt_BR,则巴西葡萄牙语语言环境用于LC_MESSAGES类别。 如果未设置这些环境变量,未安装语言环境目录,或者未使用本地语言支持(NLS)编译grep,则使用C语言环境。命令locale -a列出了当前可用的语言环境。

GREP_OPTIONS
此变量指定默认选项,放在任何显式指定的选项前面。 由于这会在编写可移植脚本时导致问题,因此将在以后的grep版本中删除此功能,并且grep会在使用它时发出警告。 请改用别名或脚本。

GREP_COLOR
此变量指定用于突出显示匹配(非空)文本的颜色。 它被弃用,以支持GREP_COLORS,但仍然受支持。 GREP_COLORS的mt、ms、mc功能优先于它。 它只能指定用于突出显示任何匹配行中匹配的非空文本的颜色(省略-v命令行选项时的选定行,或指定-v时的上下文行)。默认值为01;31,表示在终端默认背景上的粗体红色前景文本。

GREP_COLORS
指定用于突出显示输出的各个部分的颜色和其他属性。它的值是以冒号分隔的功能列表,默认为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)到右(\33[K)擦除”清除到行尾。在不支持EL的终端上需要这样做。 当所选的高亮颜色不影响背景,或者EL太慢或导致太多闪烁时,它对于不适用布尔back_color_erase(bce)terminfo功能的终端是有用的。 默认值为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色模式的背景色。

LC_ALL, LC_COLLATE, LANG
这些变量指定LC_COLLATE类别的语言环境,该类别确定用于解释范围表达式(如[a-z])的整理顺序。

LC_ALL, LC_CTYPE, LANG
这些变量指定LC_CTYPE类别的语言环境,该类别确定字符的类型,例如,哪些字符是空格。此类别还确定字符编码,即文本是以UTF-8、ASCII、其他编码进行编码。在C或POSIX语言环境中,所有字符都编码为单个字节,每个字节都是有效字符。

LC_ALL, LC_MESSAGES, LANG
这些变量指定LC_MESSAGES类别的语言环境,该类别确定grep用于消息的语言。默认的C语言环境使用美国英语消息。

POSIXLY_CORRECT
如果设置,grep的行为与POSIX要求相同;否则,grep的行为更像其他GNU程序。POSIX要求必须将文件名后面的选项视为文件名;默认情况下,此类选项被置换到操作数列表的前面,并被视为选项。 此外,POSIX要求将未识别的选项诊断为“非法”,但由于它们并非真正违法,因此默认情况下将其诊断为“无效”。 POSIXLY_CORRECT还会禁用_N_GNU_nonoption_argv_flags_,如下所述。

_N_GNU_nonoption_argv_flags_
(这里N是grep的数字进程ID。)如果此环境变量值的第i个字符为1,则不要将grep的第i个操作数视为一个选项,即使它看起来是一个选项。 shell可以将此变量放在它运行的每个命令的环境中,指定哪些操作数是文件名通配符扩展的结果,因此不应将其视为选项。 此行为仅适用于GNU C库,并且仅在未设置POSIXLY_CORRECT时才可用。

退出状态

0 找到匹配行。使用-q,–quiet,–silent选项后,如果找到了匹配行,则即使发生错误,退出状态也为0。

1 如果未选择行

2 发生错误

相关手册

常规手册页:awk(1), cmp(1), diff(1), find(1), gzip(1), perl(1), sed(1), sort(1), xargs(1), zgrep(1), read(2), pcre(3), pcresyntax(3), pcrepattern(3), terminfo(5), glob(7), regex(7)

grep(1p)

完整的在线手册:http://www.gnu.org/software/grep/manual

完整的Info手册:info grep

参考文献

man 1 grep, Version 2.27-2
How to find text files not containing text on Linux?
Can grep show only words that match search pattern? – Stack Overflow
linux – Highlight text similar to grep, but don’t filter out text – Stack Overflow
text processing – Can grep output only specified groupings that match? – Unix & Linux Stack Exchange