grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f
FILE] [FILE...]
Grep 搜索以 FILE 命名的文件输入 (或者是标准输入,如果没有指定文件名,或者给出的文件名是 - 的话),寻找含有与给定的模式 PATTERN 相匹配的内容的行。 默认情况下, grep 将把含有匹配内容的行打印出来。
另外,也可以使用两个变种程序 egrep 和 fgrep 。 Egrep 与 grep -E 相同。 Fgrep 与 grep -F 相同。
一个正则表达式是一个描述了一个字符串集合的模式。正则表达式的构造类似于算术表达式,使用各种各样的操作符来将更小的表达式连在一起。
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 匹配 不 处于一个词的边缘的空字串。
一个正则表达式后面可以跟随多种重复操作符之一。
两个正则表达式可以连接到一起;得出的正则表达式可以匹配任何由两个分别匹配连接前的子表达式的子字符串连接而成的字符串。
两个正则表达式可以用中缀操作符 | 联合到一起,得出的正则表达式可以匹配任何匹配联合前的任何一个子表达式的字符串。
重复操作符的优先级比连接高,接下来又比选择的优先级高。一个完整的子表达式可以用圆括号 (parentheses) 括住来超越这些优先级规则。(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 允许这个行为,将其视为一个扩展,但是可移植的脚本应当避免使用它。
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。
一般地,如果找到了选择的行,退出时状态值为0,否则为1。但是如果发生错误,退出时状态值是2,除非指定了 -q 或 --quiet 或 --silent 选项,并且找到了选择的行。
bug 报告的电子邮件地址是 bug-gnu-utils@gnu.org。 一定要在“Subject:”中带有 “grep” 这个词。
在 {n,m} 结构中重复次数过多会导致 grep 使用大量内存。另外,一些过分晦涩的正则表达式需要指数级的时间和空间,可能会导致 grep 耗尽所有内存。
向后引用 (backreferences) 非常慢,可能需要指数级的时间。
袁乙钧 <bbbush@163.com>
2003.11.03
http://cmpp.linuxforum.net