在类Unix的操作系统上,grep命令逐行处理文本,并打印与指定模式匹配的任何行。 本文介绍grep的GNU/Linux版本
查看英文版
1 grep 运行系统环境
2 grep 语法
3 grep 示例
4 grep 选项
5 grep 示例
Unix&Linux
grep [OPTIONS] PATTERN [FILE...]
概述
Grep代表“global regular expression print”,是一个强大的工具,用于将正则表达式与文件、多个文件或输入流中的文本进行匹配。它将搜索您在命令行上指定的文本模式,并为您输出结果。
查看英文版
假设想要在您的机器上的HTML文件中快速找到短语“Our Products”。让我们从搜索单个文件开始。在这里,我们的模式是“我们的产品”,我们的文件是product-listing.html。
发现包含我们的模式的一行,grep将整个匹配行输出到终端。该行比我们的终端宽度长,因此文本环绕到以下行,但此输出正好对应于我们文件中的一行。
注意:模式被grep解释为正则表达式。在上面的例子中,我们使用的所有字符(字母和空格)都是在正则表达式中按字面意思解释的,因此只匹配精确的短语。其他的字符有特殊的含义,例如一些标点符号。
以彩色查看grep输出
如果我们使用--color选项,我们的成功匹配将突出显示:
查看成功匹配的行数如果我们知道匹配的行出现在文件中的什么位置,它将更加有用。如果我们指定-n选项,grep将在每个匹配的行前加上行号:
我们匹配的行以“18:”为前缀,这告诉我们这对应于文件中的第18行。
执行不区分大小写的grep搜索如果“Our Products”出现在句子的开头,或者全部用大写字母出现,该怎么办?我们可以指定-i选项来执行不区分大小写的匹配:
使用-i选项,grep也可以在第23行找到匹配项。
使用通配符搜索多个文件如果要搜索多个文件,可以在文件名中使用通配符搜索所有文件。而不是指定产品-列表.html,我们可以使用星号(“*”)和.html扩展名。当执行命令时,shell将把星号扩展到它找到的(在当前目录中)以“.html”结尾的任何文件的名称。
请注意,每行都从出现匹配的特定文件开始。
递归搜索子目录我们可以使用-r选项将搜索扩展到子目录及其包含的任何文件,该选项告诉grep递归地执行搜索。让我们将文件名改为星号(“*”),这样它将匹配任何文件或目录名,而不仅仅是HTML文件:
这给了我们三个额外的匹配。请注意,不在当前目录中的任何匹配文件的目录名都包括在内。
使用正则表达式执行更强大的搜索grep的真正威力在于它可以用来匹配正则表达式。(这就是“grep”中“re”的意思)。正则表达式在模式字符串中使用特殊字符来匹配更广泛的字符串数组。让我们看一个简单的例子。
假设您希望在HTML文件中找到与“our products”相似的短语,但该短语应该始终以“our”开头,以“products”结尾。我们可以指定这样的模式:“我们的。*产品”。
在正则表达式中,句点(“.”)。被解释为单字符通配符。它的意思是“出现在此位置的任何字符都将匹配。”星号(“*”)表示“前面出现零次或多次的字符将匹配。”因此,组合“.*”将匹配任意数量的任意字符。例如,“我们令人惊叹的产品”,“我们的,有史以来最好的产品”,甚至“我们的产品”都会匹配。因为我们指定了-i选项,所以“Our Products”和“OuRpRoDuCtS”也将匹配。
在这里,我们也找到了匹配的短语“our fine products”。
Grep是一个功能强大的工具,可以帮助您处理文本文件,当您习惯于使用正则表达式时,它会变得更加强大。
技术说明grep在命名的输入文件(如果没有文件命名,或者如果文件名是一个短划线(“-”)作为文件名,则为标准输入)搜索包含与给定模式匹配的行。默认情况下,grep打印匹配的行。
此外,还提供了三个变体程序egrep、fgrep和rgrep:
在较旧的操作系统中,egrep、fgrep和rgrep是具有自己的可执行文件的不同程序。在现代系统中,这些特殊的命令名是启用了适当标志的grep的快捷方式。它们在功能上是等效的。
查看英文版
--help | 打印帮助消息,简要概述命令行选项,然后退出。 |
-V,-- version | 打印grep的版本号,然后退出。 |
-E,--extended-regexp | 将PATTERN解释为扩展的正则表达式(请参见基本与扩展的正则表达式)。 |
-F, --fixed-strings | 将PATTERN解释为要匹配的固定字符串列表,以换行符分隔。 |
-G,-- basic-regexp | 将PATTERN解释为基本正则表达式(请参见基本与扩展正则表达式)。这是运行grep时的默认选项。 |
-P,-- perl-regexp | 将PATTERN解释为Perl正则表达式。此功能仍处于试验阶段,可能会产生警告消息。 |
-e PATTERN,-regexp=PATTERN | 使用PATTERN作为匹配的模式。这可用于指定多个搜索模式,或保护以破折号(-)开头的模式。 |
-f FILE,--file = FILE | 从FILE获取模式,每行一个。 |
-i,--ignore-case | 忽略PATTERN和输入文件中的大小写区别。 |
-v, --invert-match | 反转匹配感,以选择不匹配的行。 |
-w,--word-regexp | 仅选择包含构成整个单词的匹配项的行。测试是匹配的子字符串必须在该行的开头,或者必须在非单词组成字符之前。或者,它必须在行的末尾,或后跟非单词的组成字符。单词组成的字符是字母,数字和下划线。 |
-x,-- line-regexp | 仅选择与整行完全匹配的匹配项。 |
-y | 与-i相同。 |
-c,-- count | 代替正常输出,为每个输入文件打印匹配行数。使用-v,-- invert-match选项(请参见下文),计算不匹配的行。 |
--color [= WHEN],-- colour [=WHEN ] | 匹配的(非空)字符串,匹配行,上下文行,文件名,行号,字节偏移量和分隔符(用于字段和上下文行组)用转义序列括起来,以在终端上以彩色显示它们。颜色由环境变量GREP_COLORS定义。仍支持较早的环境变量GREP_COLOR,但其设置没有优先级。WHEN是永远,永远,或汽车。 |
-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还使用了option,grep在输出NUM条不匹配的行后停止。 |
-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某物。另请参见-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 | 输出零字节(ASCII NUL字符),而不是通常在文件名后的字符。例如,grep -lZ在每个文件名之后输出一个零字节,而不是通常的newline。即使存在包含不寻常字符(例如换行符)的文件名,此选项也可以使输出明确。此选项可与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选项,此选项无效,并给出警告。 |
-a,-- text | 像对待文本一样处理二进制文件;这等效于--binary-files = text选项。 |
--binary-files=TYPE | 如果文件的前几个字节指示该文件包含二进制数据,则假定该文件的类型为TYPE。默认情况下,TYPE为二进制,并且grep通常输出单行消息,表明二进制文件匹配,如果不匹配,则不输出消息。如果TYPE为不匹配,则grep假定二进制文件不匹配;否则,grep假定二进制文件不匹配。这等效于-I选项。如果TYPE为text,则grep将二进制文件视为文本;这等效于-a选项。警告:grep --binary-files = text 可能会输出二进制垃圾,如果输出是终端并且终端驱动程序将其中一些解释为命令,则二进制垃圾可能会带来讨厌的副作用。 |
-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匹配的文件(使用通配符匹配)。一个文件名水珠可以使用*,?和[...]作为通配符和\引用通配符或反斜杠字符字面。 |
--exclude-from=FILE | 跳过基本名称与从FILE读取的任何文件名名称匹配的文件(使用通配符匹配,如--exclude所述)。 |
--exclude-dir =DIR | 从递归搜索中排除与模式DIR匹配的目录。 |
-I | 处理二进制文件,就好像它不包含匹配数据一样;这等效于--binary-files = without-match选项。 |
--include = GLOB | 仅搜索基本名称与GLOB匹配的文件(使用通配符匹配,如--exclude所述)。 |
-r, --recursive | 仅在命令行上,才遵循符号链接递归地读取每个目录下的所有文件。这等效于-d recurse选项。 |
-R,--dereference-recursive | 递归读取每个目录下的所有文件。跟随所有符号链接,这与-r不同。 |
--line-buffered | 在输出上使用行缓冲。这可能会导致性能下降。 |
--mmap | 如果可能,请使用mmap系统调用读取输入,而不是默认的读取系统调用。在某些情况下,-- mmap会产生更好的性能。但是,如果在grep运行时输入文件缩小,或者发生I / O错误,则--mmap可能导致未定义的行为(包括核心转储)。 |
-U,--binary | 将文件视为二进制文件。默认情况下,在MS-DOS和MS-Windows下,grep通过查看从文件读取的前32 KB的内容来猜测文件类型。如果grep认为文件是文本文件,它将从原始文件内容中删除CR字符(以使带有^和$的正则表达式正确运行)。指定-U会否决此猜测,导致所有文件都被逐字读取并传递给匹配机制;如果文件是每行末尾带有CR / LF对的文本文件,则将导致某些正则表达式失败。此选项对MS-DOS和MS-Windows以外的平台无效。 |
-z, --null-data | 将输入视为一组行,每行以零字节(ASCII NUL字符)而不是换行符结尾。与-Z或--null选项一样,此选项可与sort -z之类的命令一起使用以处理任意文件名。 |
正则表达式是描述一组字符串的模式。通过使用各种运算符组合较小的表达式,可以类似于算术表达式来构造正则表达式。
grep理解正则表达式语法的三种不同版本:“基本”(BRE),“扩展”(ERE)和“ perl”(PRCE)。在GNU grep中,基本语法和扩展语法之间的可用功能没有区别。在其他实现中,基本正则表达式的功能较弱。以下描述适用于扩展的正则表达式;基本正则表达式的差异将在后面总结。Perl正则表达式提供了其他功能。
基本的构建块是与单个字符匹配的正则表达式。大多数字符(包括所有字母和数字)都是匹配自己的正则表达式。任何具有特殊含义的元字符都可以在其前面加上反斜杠来引用。
句点(。)匹配任何单个字符。
字符类和括号表达式方括号表达式是由[和]括起来的字符的列表。它匹配该列表中的任何单个字符;如果列表的第一个字符是插入符号^,则它匹配列表中未包含的任何字符。例如,正则表达式[0123456789]与任何一位数字匹配。
在方括号表达式中,范围表达式由两个字符组成,并用连字符分隔。它使用语言环境的整理顺序和字符集来匹配在两个字符(包括两个字符)之间排序的任何单个字符。例如,在默认的C语言环境中,[ad]等效于[abcd]。许多语言环境都按字典顺序对字符进行排序,在这些语言环境中,[ad]通常不等同于[abcd];例如,它可能等效于[aBbCcDd]。要获得括号表达式的传统解释,可以通过将LC_ALL 环境变量设置为值C来使用C语言环境。
最后,在括号表达式中预定义了某些命名的字符类,如下所示。它们的名称不言自明,分别是[:alnum:],[:alpha:],[:cntrl:],[:digit:],[:graph:],[:lower:],[:print:],[:punct:],[:space:],[:upper:]和[:xdigit:]。例如,[[:alnum:]]表示当前语言环境中的数字和字母的字符类。在C语言环境和ASCII字符集编码中,这与[0-9A-Za-z]相同。(请注意,这些类名称中的方括号是符号名的一部分,并且除了界定方括号的方括号外,还必须包括这些方括号。)大多数元字符在方括号表达式中失去其特殊的含义。要包含文字],请将其放在列表的第一位。同样,要包含文字^,请先将其放置在其他任何地方。最后,要包含文字-,请将其放在最后。
锚定插入符号^和美元符号$是元字符,分别与行的开头和结尾处的空字符串匹配。
反斜杠字符和特殊表达符号\< and \>分别与单词开头和结尾的空字符串匹配。符号\ b匹配单词边缘的空字符串,\ B匹配单词不在单词边缘的空字符串。符号\ w是[_[:alnum:]]的同义词,\ W是[^_[:alnum:]]的同义词。
重复正则表达式后可以跟几个重复运算符之一:
? | 上一项是可选的,最多匹配一次。 |
* | 前一项将被匹配零次或多次。 |
+ | 前一项将被匹配一次或多次。 |
{ n } | 上一项完全匹配n次。 |
{ n ,} | 前一项匹配n次或多次。 |
{ n ,m } | 前一项至少匹配n次,但不超过m次。 |
两个正则表达式可以串联 ; 生成的正则表达式与通过串联两个分别与串联表达式匹配的子字符串形成的字符串匹配。
交替infix运算符可以将两个正则表达式连接起来。; 结果正则表达式与匹配任一备用表达式的任何字符串匹配。
优先顺序重复优先于串联,反过来优先于交替。整个表达式可以用括号括起来,以覆盖这些优先级规则并形成子表达式。
反向引用和子表达式向后引用\ n,其中n是一个数字,与先前由正则表达式的第n个括号括起来的子表达式匹配的子字符串匹配。
基本与扩展正则表达式在基本正则表达式中,元字符?, +, {, |, (, and )失去特殊含义;而是使用反斜杠版本\?, \+, \{, \|, \(, and \)。
传统版本的egrep不支持{元字符,而有些egrep实现则支持\ {,因此可移植脚本应避免使用grep -E模式中的{,并应使用[{]来匹配文字{。
GNU grep -E尝试通过假设{如果是无效间隔指定的开始不特殊,则支持传统用法。例如,命令grep -E'{1'搜索两个字符的字符串{1,而不是在正则表达式中报告语法错误。POSIX允许将此行为作为扩展,但可移植脚本应避免这种情况。
环境变量grep的行为受以下环境变量影响。
通过依次检查三个环境变量LC_ALL,LC_foo和LANG,可以指定类别LC_foo的语言环境。设置的这些变量中的第一个指定语言环境。例如,如果未设置LC_ALL,但LC_MESSAGES设置为pt_BR,则将巴西葡萄牙语语言环境用于LC_MESSAGES类别。该Ç如果没有这些环境变量的设置使用的语言环境,如果没有安装的区域设置目录,或者如果grep的不符合国家语言支持(NLS)编译。
注意的其他变量:
GREP_OPTIONS | 此变量指定将默认选项放置在任何显式选项的前面。例如,如果GREP_OPTIONS为' --binary- files = without-match --directories = skip ',则grep的行为就像在任何一个选项之前都指定了--binary-files = without-match和--directories = skip这两个选项一样显式选项。选项规格由空格分隔。反斜杠转义下一个字符,因此可用于指定包含空格或反斜杠的选项。 | ||||||||||||||||||||||
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)。支持的功能如下:
请参阅文本终端文档中的“选择图形呈现(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类别的语言环境,该语言环境确定用于解释范围表达式(如[az])的整理顺序。 | ||||||||||||||||||||||
LC_ALL,LC_CTYPE,LANG | 这些变量为LC_CTYPE类别指定区域设置,该区域设置确定字符的类型,例如哪些字符为空格。 | ||||||||||||||||||||||
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个操作数似乎为1,也不要将其视为选项。Shell可以为它运行的每个命令将此变量放入环境中,并指定哪些操作数是文件名通配符扩展的结果,因此不应将其视为选项。仅对于GNU C库,并且仅在未设置POSIXLY_CORRECT时,此行为才可用。 |
如果找到选定的行,则退出状态为0,如果未找到,则退出状态为1。如果发生错误,则退出状态为2。
查看英文版
grep chope /etc/passwd
在/ etc / passwd中搜索用户chope。
grep "May 31 03" /etc/httpd/logs/error_log
在Apache error_log文件中搜索5月31日凌晨3点发生的任何错误条目。通过在字符串周围添加引号,可以在grep搜索中放置空格。
grep -r"computerhope" / www /
递归搜索目录/ www /和所有子目录,以查找任何包含字符串“ computerhope ”的文件的任何行。
grep -w "hope" myfile.txt
在文件myfile.txt中搜索包含单词“ hope ”的行。只有包含不同词“希望”的行才会被匹配。“希望”是单词一部分的行将不匹配。
grep -cw "hope" myfile.txt
与上一个命令相同,但是显示匹配的行数,而不是匹配的行本身。
grep -cvw "hope" myfile.txt
与上一个命令相反:显示myfile.txt中不包含单词“ hope”的行数。
grep -l "hope" /www/*
显示/ www /(但不包括其子目录)中内容包含字符串“ hope ” 的任何文件的文件名(但不显示匹配行本身)。
相关命令
ed —一个简单的文本编辑器。
egrep —过滤与扩展的正则表达式匹配的文本。
sed —用于过滤和转换文本的实用程序。
sh — Bourne shell命令解释器。
如果您还没有看过我们的示例用法部分,我们建议您先回顾一下该部分。
查看英文版
gzip,gunzip and zcat | gawk | getfacl | gpasswd | gprof | groupadd | groupdel | groupmod |
未知的网友