grep 命令
NAME
grep, egrep, fgrep - 打印匹配给定模式的行
总览 SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
描述 DESCRIPTION
Grep 搜索以 FILE 命名的文件输入 (或者是标准输入,若是没有指定文件名,或者给出的文件名是 -
的话),寻找含有与给定的模式 PATTERN 相匹配的内容的行。 默认状况下, grep
将把含有匹配内容的行打印出来。
另外,也可使用两个变种程序 egrep 和 fgrep 。 Egrep 与 grep -E 相同。 Fgrep 与 grep -F 相同。
选项 OPTIONS
-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(2) 系统调用来读取输入,而不是默认的 read(2)
系统调用。在一些状况下, --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
使用行缓冲,it can be a performance penality.
-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
只选择能匹配完整一行的匹配。
-y -i 的同义词,废弃不用。
-Z, --null
输出一个全零字节 (ASCII 码中的 NUL 字符) 而不是通常状况下输出在文件名以后的字符。例如,
grep -lZ
在每一个文件名以后输出一个全零字节而不是普通的新行符。这个选项使得输出清楚明白,即便文件名的
表示中包含特殊字符好比新行符。这个选项能够与命令
find -print0, perl -0, sort -z, 和 xargs -0
一块儿使用,来处理任意的文件名,即便是那些含有新行符的文件名。
正则表达式 REGULAR EXPRESSIONS
一个正则表达式是一个描述了一个字符串集合的模式。正则表达式的构造相似于算术表达式,使用各类各样的操做符来将更小的表达式连在一块儿。
Grep 能理解两种不一样版本的正则表达式语法:“basic” 和 “extended”。在 GNU grep
中,两种语法能够实现的功能是没有区别的。在其余实现中,基本 (basic)
正则表达式表达能力要弱一点。下面的描述适用于扩展的 (extended)
正则表达式,它与基本正则表达式的区别会在最后作一个总结。
基本的构造块是匹配单个字符的正则表达式。大部分字符,包括全部字母和数字,是匹配它们自身的正则表达式。任何具备特殊含义的元字符能够经过前置一个反斜杠来引用。(may
be quoted by preceding it with a backslash.)
方括号表达式 (bracket) 是一个字符序列,放在 [ 和 ]
当中。它匹配序列中的任何一个字符;若是序列中的第一个字符是脱字符 (caret) ^ 那么它匹配 不在
序列中的任何一个字符。例如,正则表达式 [0123456789] 匹配任何一个数字。
在方括号表达式之中,一个 范围表达式 (range) 由两个字符组成,中间用一个连字符 (hyphen)
分隔。它匹配在这两个字符之间的任何一个字符,使用本地化的序列顺序和字符集。(that sorts between
the two characters,inclusive, using the locale's collating sequence and character set.)
例如,在默认的 C locale中, [a-d] 与 [abcd] 等价。典型的,许多 locale
将字符以字典顺序排序,在这些 locale 中, [a-d] 不与 [abcd] 等价;例如它可能与 [aBbCcDd]
等价。要得到传统的对方括号表达式的解释,能够设定环境变量 LC_ALL 值为 C 来使用 locale C 。
最后,在方括号表达式中有一些预约义的字符类,以下所示。它们的名字是自说明的,它们是
[:alnum:](字母和数字), [:alpha:](字母), [:cntrl:](), [:digit:](数字), [:graph:](),
[:lower:](小写字母), [:print:](可打印字符), [:punct:](), [:space:](空格), [:upper:](大写字母),
和 [:xdigit:] 。例如, [[:alnum:]] 意思是 [0-9A-Za-z] ,可是后一种表示方法依赖于 locale C
和ASCII 字符编码,而前一种是与 locale
和字符集无关的。(注意这些字符类名中的方括号也是符号名称的一部分,必须包含在用来为序列定界的方括号
之中。)
大多数元字符处于序列中时会失去它们的特殊意义。为了包含一个字面意义 (literal) 的 ]
,须要将它放在序列的最前。与此类似,为了包含一个字面意义 (literal) 的 ^
,须要将它放在除了序列最前以外的其余位置。最后,为了包含一个字面意义 (literal) 的 -
,须要将它放在序列最后。
句点符 (period) . 匹配任何一个字符。符号 \w 是 [[:alnum:]] 的同义词, \W 是 [^[:alnum]]
的同义词。
脱字符 (caret) ^ 和美圆标记 (dollar) $ 分别是匹配一行的首部和尾部的空字串的元字符。符号 \< 和
\> 分别是匹配一个词的首部和尾部的空字串的元字符。符号 \b 匹配一个词边缘 (edge) 的空字串,符号
\B 匹配 不 处于一个词的边缘的空字串。
一个正则表达式后面能够跟随多种重复操做符之一。
? 先前的项是可选的,最多匹配一次。
* 先前的项能够匹配零次或屡次。
+ 先前的项能够匹配一次或屡次。
{n} 先前的项将匹配刚好 n 次。
{n,} 先前的项能够匹配 n 或更屡次。
{n,m} 先前的项将匹配至少 n 词,可是不会超过 m 次。
两个正则表达式能够链接到一块儿;得出的正则表达式能够匹配任何由两个分别匹配链接前的子表达式的子字符串链接而成的字符串。
两个正则表达式能够用中缀操做符 |
联合到一块儿,得出的正则表达式能够匹配任何匹配联合前的任何一个子表达式的字符串。
重复操做符的优先级比链接高,接下来又比选择的优先级高。一个完整的子表达式能够用圆括号 (parenthe‐
ses) 括住来超越这些优先级规则。(to override these precedence rules.)
反向引用 \n 中, n 是一个数字,匹配正则表达式中,以第 n
个圆括号括住的子表达式已匹配的子字符串。
在基本正则表达式中,元字符 ?, +, {, |, (, 和 ) 丧失了它们的特殊意义;做为替代,使用加反斜杠的
(backslash) 版本 \?, \+, \{, \|, \(, 和 \) 。
传统的 egrep 不支持元字符 { ,而且一些 egrep 的实现经过支持 \{
来代替它,所以可移植的脚本应当避免 在 egrep 中使用 { 模式,应当使用 [{] 来匹配一个字面意义
(literal) 的 { 。
GNU egrep 经过假设若是 { 处于 an invalid interval specification
的起始,就不是一个特殊字符,来支持传统的用法。例如,shell 命令 egrep '{1'
将会搜索这个两字符的字符串 {1 而不是报告在正则表达式中发生了语法错误。POSIX.2
容许这个行为,将其视为一个扩展,可是可移植的脚本应当避免使用它。
环境变量 ENVIRONMENT VARIABLES
Grep 的行为受下列环境变量影响。
一个 locale LC_foo 是经过按下面的顺序, LC_ALL, LC_foo, LANG,
检查这三个环境变量的取值而肯定的。设置了的第一个变量指定了 locale。例如,若是 LC_ALL
没有设置,可是 LC_MESSAGES 设置为 pt_BR ,那么巴西的葡萄牙语 (Brazilian Portuguese) 将用做
LC_MESSAGES locale 的值。若是没有设置这其中任何一个环境变量,或者没有安装所设置的 locale
目录,或者若是 grep 没有将国家和语言支持 (national language support (NLS)) 编译在内,将默认使用
locale C。
GREP_OPTIONS
这个变量指定了将放在全部显式指定的选项以前的默认选项。例如,若是 GREP_OPTIONS 是
'--binary-files=without-match --directories=skip' 的话, grep
将像已经在任何显式指定的选项以前指定了 --binary-files=without-match 和 --directo‐
ries=skip 选项那样来运做。选项以空白 (whitespace) 分隔。一个反斜杠 (backslash)
使得下一个字符转义 (escape),所以能够用来指定一个含有空白或者反斜杠的选项。
GREP_COLOR
指定用来高亮显示的标记。
LC_ALL, LC_COLLATE, LANG
这些变量指定了 locale LC_COLLATE ,决定了解释相似 [a-z] 的范围表达式时的序列顺序 (col‐
lating sequence) 。
LC_ALL, LC_CTYPE, LANG
这些选项指定了 locale LC_CTYPE ,决定了字符的类型,例如,哪些字符是空白 (whitespace) 。
LC_ALL, LC_MESSAGES, LANG
这些选项指定了 locale LC_MESSAGES ,决定了 grep 的消息使用的语言。默认的 locale C
使用美国英语的消息。
POSIXLY_CORRECT
若是设置了的话, grep 将像 POSIX.2 要求的那样来运做;不然, grep 将像其余 GNU
程序同样来运做。POSIX.2
要求文件名以后的选项必须视为文件名;默认状况下,这些选项被交换到操做数列表的前面,被看成选
项来处理。同时,
POSIX.2 要求不可识别的选项在诊断消息中表示为 “ille‐
gal”,可是既然它们没有真正触犯法律,所以默认状况下它们在诊断 (diagnose) 消息中表示为
“invalid”。 POSIXLY_CORRECT 同时禁止了下面描述的 _N_GNU_nonoption_argv_flags_。
_N_GNU_nonoption_argv_flags_
(这里 N 是 grep's 数字形式的进程ID。) 若是这个环境变量的值的第 i 个字符是 1 ,那么不将
grep 的第 i 个操做数视为一个选项,即便它看上去像。shell
能够将这个变量设置在它运行的每一个命令的环境中,指定哪一个操做数是文件名通配符扩展的结果,所以
不该当被视为选项。这个行为只有在使用
GNU C 库时有效,而且只有在 POSIXLY_CORRECT 没有设置的时候。
诊断 DIAGNOSTICS
通常地,若是找到了选择的行,退出时状态值为0,不然为1。可是若是发生错误,退出时状态值是2,除非指定
了
-q 或 --quiet 或 --silent 选项,而且找到了选择的行。
BUGS
bug 报告的电子邮件地址是 bug-gnu-utils@gnu.org。 必定要在“Subject:”中带有 “grep” 这个词。
在 {n,m} 结构中重复次数过多会致使 grep
使用大量内存。另外,一些过度晦涩的正则表达式须要指数级的时间和空间,可能会致使 grep
耗尽全部内存。
向后引用 (backreferences) 很是慢,可能须要指数级的时间。
git