grep命令中文手册(info grep翻译)

bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


1.本文为info man的译文,基本按照原文翻译,有几个用不上的选项没有翻译,但为了文章的完整性,给出了原文。
2.译文中有些"(注:)",为本人自行加入,帮助理解和说明,非原文内容!git

本人译做集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlweb

1 Introduction


'grep'用于搜索给定文件中能匹配给定pattern列表的行。当某行能匹配上,(默认)将拷贝该行到标准输出,或者根据你所指定的选项生成其它序列的输出。正则表达式

尽管'grep'所指望的是在文本行中作匹配,但即便某输入行的大小长度超出了可用内存空间也不会受到限制,它仍能够匹配一行中任意字符串。若是输入文件的最后一个字节不是换行符,'grep'会自动补上一个。因为换行符也是pattern列表的分隔符,所以没有任何办法匹配文本中的换行符。shell

2 Invoking 'grep'


'grep'命令行的通常语法格式为:express

grep OPTIONS PATTERN INPUT_FILE_NAMES

OPTIONS部分能够指定0或多个。只有当没有使用"-e PATTERN"或"-f FILE"时,指定的PATTERN才被grep可视。能够指定0或多个INPUT_FILE_NAMES。编程

2.1 Command-line Options(命令行选项)

'grep'有大量选项可用:一些是POSIX.2中的,一些是GNU扩展的。长选项都是GNU扩展选项,即便它们来自于POSIX。由POSIX指定的短选项,被明确标注为便于POSIX可移植性编程。有少数几个选项是为了兼容古老版本的grep。 有几个额外的选项用于控制使用哪一种变体'grep'匹配引擎(注:fgrep/grep/egrep)。bash

2.1.1 Generic Program Information

'--help'
输出简短的grep命令行使用帮助并退出。 less

'-V'
'--version'
输出'grep'的版本号。 socket

2.1.2 Matching Control(控制匹配模式)

'-e PATTERN'
'--regexp=PATTERN'
明确指定使用此处的PATTERN做为待匹配的pattern。该选项能够指定屡次,它能够保护以"-"开头的pattern。('-e'是POSIX指定的选项。)

'-f FILE'
'--file=FILE'
从FILE中获取pattern列表,每行一个pattern。空的FILE表示不给定任何pattern,因此不会匹配到任何内容。('-f'是POSIX指定的选项。)

'-i'
'-y'
'--ignore-case'
忽略PATTERN中的大小写,也忽略输入文件中的大小写区别。'-y'是废弃的用于和老版本保持兼容性的选项。('-i'是POSIX指定的选项。)

'-v'
'--invert-match'
反转匹配的结果,即选择那些未匹配到的行。('-v'是POSIX指定的选项。)

'-w'
'--word-regexp'
仅选择能精确匹配整个单词的行。单词的组成字符包括:字母、数字和下划线。除了这些字符,其他都是该选项筛选单词时的单词边界分隔符。 (注:例如字符串"fstab fstab(5)",grep -w 'fstab'或grep -w 'fsta.'能匹配这两个单词,但grep -w 'fsta'没法匹配任意一个)

'-x'
'--line-regexp'
仅选择能精确匹配整行内容的行。('-x'是POSIX指定的选项。)
(注:例如某行"abcde",grep -x 'abc'将没法匹配该行,而grep -x 'abcd.'能匹配该行)

2.1.3 General Output Control(控制输出内容)

'-c'
'--count'
再也不输出匹配的内容,而是输出匹配到的行数量。若是给定了"-v"选项,则输出未匹配到的行数量。('-c'是POSIX指定的选项。)

'--color[=WHEN]'
'--colour[=WHEN]'
对匹配到的内容赋予颜色并输出。WHEN的有效值包括:'never'、'always'或'auto'。

'-L'
'--files-without-match'
再也不输出匹配的内容,而是输出未能被匹配到的文件名,当某文件中的某行被匹配到,将再也不继续向下搜索该文件。
(注:和"-l"输出的文件名相反)

'-l'
'--files-with-matches'
再也不输出匹配的内容,而是输出能被匹配到的文件名,当某文件中的某行被匹配到,将再也不继续向下搜索该文件。('-l'是POSIX指定的选项。)

'-m NUM'
'--max-count=NUM'
当匹配成功的行有NUM行时,中止读取文件。若是是普通文件做为标准输入,则输出这匹配到的NUM行。grep会在最后一次匹配行后作位置标记,使得调用的另外一个进程能够今后处恢复并继续向下搜索。例如,下面的shell脚本:

while grep -m 1 PATTERN
do
echo xxxx
done < FILE

而下面的shell脚本则以不一样于上面脚本方式运行,由于此处使用的是管道,这不是一个实体文件:

cat FILE |
while grep -m 1 PATTERN
do
echo xxxx
done

(注:若是对这两个脚本有疑问,可参考while循环中的陷阱,该文章中解释了管道和文件直接重定向时的区别)

'-o'
'--only-matching'
输出被匹配到的字符串,而不是输出整行。每一个被匹配到的字符串都使用单独的行输出。

'-q'
'--quiet'
'--silent'
静默模式,当即退出,即便遇到了错误。不写任何内容到标准输出。若是匹配到了内容则退出状态码为0。('-q'是POSIX指定的选项。)

'-s'
'--no-messages'
禁止输出因文件不存在或文件没有读权限而产生的错误信息。('-s'是POSIX指定的选项。)

(注:因为POSIX和GNU grep的差别性,在可移植性的脚本中,应尽可能避免使用"-q"和"-s",而是使用重定向的方式重定向到/dev/null)

2.1.4 Output Line Prefix Control(控制输出行的前缀)

当输出行有前缀要输出时,它们的顺序老是:文件名、行号、字节的偏移量,这个顺序不会由于前缀控制选项的顺序而改变。

'-b'
'--byte-offset'
Print the 0-based byte offset within the input file before each line of output. If '-o' ('--only-matching') is specified, print the offset of the matching part itself. When 'grep' runs on MS-DOS or MS-Windows, the printed byte offsets depend on whether the '-u' ('--unix-byte-offsets') option is used; see below.

'-H'
'--with-filename'
输出匹配到内容所在文件的文件名。当指定了多个输入文件时,这是默认的。

'-h'
'--no-filename'
禁止输出文件名。当只有一个输入文件时,这是默认的。

'--label=LABEL'
Display input actually coming from standard input as input coming from file LABEL. This is especially useful when implementing tools like 'zgrep'; e.g.:

gzip -cd foo.gz | grep --label=foo -H something

'-n'
'--line-number'
输出匹配内容在文件中的行号,每一个文件都单独从1开始计数。('-n'是POSIX指定的选项。)

'-T'
'--initial-tab'
Make sure that the first character of actual line content lies on a tab stop, so that the alignment of tabs looks normal. This is useful with options that prefix their output to the actual content:'-H', '-n', and '-b'. In order to improve the probability that lines from a single file will all start at the same column, this also causes the line number and byte offset (if present) to be printed in a minimum-size field width.

'-u'
'--unix-byte-offsets'
Report Unix-style byte offsets. This option causes 'grep' to report byte offsets as if the file were a Unix-style text file, i.e., the byte offsets ignore the 'CR' characters that were stripped. This will produce results identical to running 'grep' on a Unix machine. This option has no effect unless the '-b' option is also used; it has no effect on platforms other than MS-DOS and MS-Windows.

'-Z'
'--null'
在输出文件名时,使用"\0"放在文件名后,这会替换本来使用的字符,如换行符或冒号。例如"grep -lZ"输出的每一个文件都在同一行而不是分行,"grep -HZ"使得文件名后没有冒号。

2.1.5 Context Line Control(控制输出行的上下文)

不管下面的选项如何设置,grep都不会屡次输出同一行。若是指定了"-o"选项,这些选项将失效,并给出一个警告。

'-A NUM'
'--after-context=NUM'
除了输出匹配到的行,还输出匹配到内容的后NUM行。

'-B NUM'
'--before-context=NUM'
除了输出匹配到的行,还输出匹配到内容的前NUM行。

'-C NUM'
'-NUM'
'--context=NUM'
除了输出匹配到的行,还输出匹配到内容的前NUM行和后NUM行。

'--group-separator=STRING'
当使用'-A', '-B' or '-C'时,使用STRING替代默认的组分隔符。

(注:组分隔符表示匹配到的内容的上下文。例如"-A 2",在某行匹配到时,还将输出后两行,这是一个组。下一次匹配成功时,若是是在该组以后行匹配上的,则这两组中间默认使用"--"分隔)

'--no-group-separator'
当使用'-A', '-B' or '-C'时,不输出任何组分隔符,而是将不一样组相邻输出。

2.1.6 File and Directory Selection(文件和目录的选择)

'-a'
'--text'
Process a binary file as if it were text; this is equivalent to the '--binary-files=text' option.

'--binary-files=TYPE'
If the first few bytes of a file indicate that the file contains binary data, assume that the file is of type TYPE. By default, TYPE is 'binary', and 'grep' normally outputs either a one-line message saying that a binary file matches, or no message if there is no match. If TYPE is 'without-match', 'grep' assumes that a binary file does not match; this is equivalent to the '-I' option. If TYPE is 'text', 'grep' processes a binary file as if it were text; this is equivalent to the '-a' option. Warning: '--binary-files=text' might output binary garbage, which can have nasty side effects if the output is a terminal and if the terminal driver interprets some of it as commands.

'-D ACTION'
'--devices=ACTION'
If an input file is a device, FIFO, or socket, use ACTION to process it. By default, ACTION is 'read', which means that devices are read just as if they were ordinary files. If ACTION is 'skip', devices, FIFOs, and sockets are silently skipped.

'-d ACTION'
'--directories=ACTION'
If an input file is a directory, use ACTION to process it. By default, ACTION is 'read', which means that directories are read just as if they were ordinary files (some operating systems and file systems disallow this, and will cause 'grep' to print error messages for every directory or silently skip them). If ACTION is 'skip', directories are silently skipped. If ACTION is 'recurse', 'grep' reads all files under each directory, recursively; this is equivalent to the '-r' option.

'--exclude=GLOB'
忽略basename能被GLOB匹配到的文件。GLOB通配符包括:"*"、"?"和"[...]"。

'--exclude-from=FILE'
从FILE中读取exclude的排除规则。

'--exclude-dir=DIR'
筛选出不进行递归搜索的目录,使用DIR进行匹配。

'-I'
Process a binary file as if it did not contain matching data; this is equivalent to the '--binary-files=without-match' option.

'--include=GLOB'
只搜索basename能被GLOB匹配的文件。

'-r'
'-R'
'--recursive'
从命令行中给定的目录中递归进去,搜索其中的每一个文件和目录。

2.1.7 Other Options(其余选项)

'--line-buffered'
Use line buffering on output. This can cause a performance penalty.

'--mmap'
This option is ignored for backwards compatibility. It used to read input with the 'mmap' system call, instead of the default 'read' system call. On modern systems, '--mmap' rarely if ever yields better performance.

'-U'
'--binary'
Treat the file(s) as binary. By default, under MS-DOS and MS-Windows, 'grep' guesses the file type by looking at the contents of the first 32kB read from the file. If 'grep' decides the file is a text file, it strips the 'CR' characters from the original file contents (to make regular expressions with '^' and '$' work correctly). Specifying '-U' overrules this guesswork, causing all files to be read and passed to the matching mechanism verbatim; if the file is a text file with 'CR/LF' pairs at the end of each line, this will cause some regular expressions to fail. This option has no effect on platforms other than MS-DOS and MS-Windows.

'-z'
'--null-data'
以"\0"做为输入行的分隔符,而再也不以换行符分隔两行。
(注:这为grep提供了简单的跨行匹配的能力。见后文示例14。)

2.2 Exit Status(退出状态码)

一般状况下,若是能匹配到内容,则退出状态码为0,不然为1。可是若是发生了错误,则退出状态码为2,除非使用了"-s"或"-q"选项。

2.3 'grep' Programs(各类grep程序)

有4种grep程序分别支持不一样的搜索引擎,使用下面4个选项能够选择使用哪一种grep程序。

'-G'
'--basic-regexp' 使用基础正则表达式引擎解析PATTERN,所以只支持基础正则表达式(BRE)。这是默认grep程序。

'-E'
'--extended-regexp'
使用扩展正则表达式引擎解析PATTERN,所以支持扩展正则表达式(ERE)。('-E'是POSIX指定的选项。)

'-F'
'--fixed-strings'
不识别正则表达式,而是使用字符的字面意义解析PATTERN,所以只支持固定字符串的精确匹配。('-F'是POSIX指定的选项。)

'-P'
'--perl-regexp'
使用perl正则表达式引擎解析PATTERN,所以支持Perl正则表达式。但该程序正处于研究测试阶段,所以会给出一个警告。

此外,"grep -E"和"grep -F"可分别简写为egrep和fgrep。但这两个简写程序是传统写法,已被废弃,虽仍支持,但只是为了兼容老版本程序。
(注:还有zgrep和pgrep,但它们不是grep家族的程序,zgrep是gzip提供,pgrep用于查看进程名和pid的映射关系)

3 Regular Expressions(正则表达式)


正则表达式是一种用于描述字符串集合的表达式。正则表达式相似于算术表达式,也使用各类操做符组合各短小表达式。grep能够理解三种不一样版本的正则表达式:基础正则表达式BRE、扩展正则表达式ERE和Perl正则表达式。下面所描述的是扩展正则表达式的内容,在后文会比较BRE和ERE的不一样之处。而Perl正则功能更完整、性能更好,能够从pcresyntax(3)和pcrepattern(3)中获取详细信息,但有些操做系统中可能没法获取。

3.1 Fundamental Structure(基本结构)

基本结构块是匹配单个字符的正则表达式。大多数字符,包括字母和数字,都能本身匹配本身,例如给定正则表达式"a",它能匹配字母a。全部的元字符都具备特殊意义,须要使用反斜线进行转义。

正则表达式可使用下面几种方式来表示重复次数。

'.'
点"."能够匹配任意单个字符。

'?'
能够匹配前一个条目0或一次。例如,"ca?b"能够匹配"cb"也能够匹配到"cab",但不能匹配到"caab"。若是使用了分组,如"c(ca)?b"能匹配"cb"或"ccab"。

'*'
匹配前一个条目0或任意屡次。

'+'
匹配前面的条目一次或屡次。

'{N}'
匹配前面的条目正好N次。

'{N,}'
匹配前面的条目N次或更屡次。即至少匹配N次。

'{,M}'
匹配前面的条目最多M次。即匹配0到M次。

'{N,M}'
匹配前面的条目N到M次。

两个正则表达式能够进行串联,串联后的匹配结果是这两个正则表达式的匹配结果进行的串联。例如正则表达式"ab"就是"a"和"b"串联后的正则。

两个正则表达式还可使用竖线符号"|"进行链接,这表示两者选一,只要能匹配竖线两边任意一个正在表达式都可,若能同时匹配上也可。例如字符串"acx"、"bx"、"accb"均能被正则表达式"ac|b"匹配上,其中"accb"被同时匹配上。

重复次数的符号优先级高于串联高于两者选一符号"|",使用括号能够改变优先级规则。

3.2 Character Classes and Bracket Expressions(字符类和中括号表达式)

中括号正则表达式是使用"["和"]"包围的字符列表。它能匹配该列表中的任意单个字符。若是列表中的第一个字符是"^",则表示不匹配该列表中的任意单个字符。例如,'[0123456789]'能匹配任意数字。

中括号中可使用连字符"-"链接两个字符表示"范围"。例如,C字符集下的"[a-d]"等价于"[abcd]"。大多数字符集规则和字典排序规则同样,这意味着"[a-d]"不等价于"[abcd]",而是等价于"[aBbCcDd]"。能够设置环境变量"LC_ALL"的值为C使得采起C字符集的排序规则。

最后,预约义了几个特定名称的字符类,它们都使用中括号包围。以下:

'[:alnum:]'
匹配大小写字母和数字。等价于字符类'[:alpha:]'与字符类'[:digit:]'的和。

'[:alpha:]'
字母字符类。匹配大小写字母。等价于字符类'[:lower:]'和字符类'[:upper:]'的和。

'[:blank:]'
空白字符类。包括:空格和制表符。

'[:cntrl:]'
控制字符类。在ASCII中,这些字符的八进制代码从000到037,还包括177(DEL)。

'[:digit:]'
数字字符类。包括:'0 1 2 3 4 5 6 7 8 9'。

'[:graph:]'
绘图类。包括:大小写字母、数字和标点符号。

'[:lower:]'
小写字母类。包括:'a b c d e f g h i j k l m n o p q r s t u v w x y z'。

'[:print:]'
打印字符类。包括:大小写字母、数字、标点符号和空格。等价于字符类'[:alnum:]'与字符类'[:punct:]'和空格的和。

'[:punct:]'
标点符号类。包括:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'。

'[:space:]'
空格字符类。包括:空格、制表符、垂直制表符、换行符、回车符和分页符。

'[:upper:]'
大写字母类。包括:'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'。

'[:xdigit:]'
十六进制类。包括:'0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'。

例如,"[[:alnum:]]"表示"[0-9A-Za-z]","[^[:digit:]]"表示[^0123456789],"[ABC[:digit:]]"表示"[ABC0-9]"。注意,字符类必须包含在额外的中括号内。

中括号中的大多数元字符都丢失了它们特殊意义,而成为普通的字面符号。

']'
该符号表示中括号的结束。若是要匹配该字面字符,则必须将其放在字符列表的最前面。即"[]...]"。

'[.'
该符号表示排序符号的开始。
(注:排序类须要在字符集中预先定义好才能使用。例如[.ab.]表示将“ab”做为总体匹配,不匹配a或b。但默认状况下,字符集里确定是没有定义好"ab"这个排序总体的,因此没法使用)

'.]'
表示排序符号的结束。

'[='
表示等价类的开始。
(注:例如,[=e=]表示将字母e的第一声和第三声等不一样音节的同字母当作相同字符。)

'=]'
表示等价类的结束。

'[:'
表示字符类的开始。

':]'
表示字符类的结束。

'-'
该字符是范围链接符,所以要匹配该符号的字面意义,须要将其放在列表的最前面或最后面或做为范围的结束字符。

'^'
该字符表示不在列表中的字符。若是想匹配该字符的字面意义,则必须不能放在列表的第一个字符。

3.3 The Backslash Character and Special Expressions(反斜线字符和特殊的表达式)

反斜线"\"后使用特定的字符表示特殊意义,以下:

'\b'
匹配单词边界处的空字符。 (注:grep中的单词有数字、字母和下划线组成,其余全部字符都是单词的分隔符。)

'\B'
和"\b"相反,表示匹配非单词边界的空字符。

'\<'
匹配单词起始位置处的空字符。

'\>'
匹配单词结束位置处的空字符。

(注:因此\bWORD\b等价于\<word\>。另外,grep选项"-w"也表示匹配单词边界)

'\w'
匹配单词成分的字符。是[_[:alnum:]]的同义词。

'\W'
匹配非单词成分的字符,是[^_[:alnum:]]的同义词。

'\s'
匹配空白字符,是[[:space:]]的同义词。

'\S'
匹配非空白字符,是[^[:space:]]的同义词。

例如,"\brat\b"匹配被分割后的"rat","\Brat\B"匹配"crate"但不匹配"furry rat"。

3.4 Anchoring(锚定)

脱字符"^"以及美圆符"$"是锚定元字符,分别匹配行首和行尾的空字符。

3.5 Back-references and Subexpressions(后向引用和子表达式)

反向引用"\N"表示匹配前面第N个括号中的正则子表达式,其中N是单个数字。例如"(a)\1"表示"aa"。当使用二选一的操做符"|"时,若是分组不参与匹配过程,则后向引用将失败。例如"a(.)|b\1"将没法匹配"ba"。 若是使用"-e"或"-f FILE"指定了多个PATTERN,则每一个pattern的后向序列值都相互独立。

(注:例如:'([ac])e\1|b([xyz])\2t'能匹配aea或cec,但不能匹配cea或aec,还能匹配bxxt或byyt或bzzt。但若是将"\2"换成"\1",即'([ac])e\1|b([xyz])\1t',将没法匹配b[xyz]at或b[xyz]ct,由于第一个括号在左边,没法参与右边的正则搜索。

(注:反向引用也称为后向引用或回溯引用)

3.6 Basic vs Extended Regular Expressions(基础正则和扩展正则)

在基础正则表达式中,元字符'?'、'+'、'{'、'|'、'(',和')'都表示字面意思,取而代之的是加上反斜线的版本:'\?'、'\+'、'\{'、'\|'、'\('和'\)'。

4 Usage(使用示例)


如下是一些GNU grep的使用示例:

grep -i 'hello.*world' menu.h main.c

该命令用于列出menu.h和main.c中包含"hello"字符串且后面带有"world"字符串的全部行,hello和world中间能够有任意多个字符。注意正则表达式的"-i"选项使得grep忽略大小写,因此还能匹配"Hello, world!"。

下面是一些使用grep时常见的问题和答案。

  1. 如何列出匹配的文件名?

    grep -l 'main' *.c

    将列出当前目录下全部以".c"结尾且文件中包含'main'字符串的文件名。

  2. 如何递归搜索目录?

    grep -r 'hello' /home/gigi

    搜索/home/gigi目录下全部文件,且文件中包含'hello'字符串。若是要灵活控制搜索的文件,能够结合find和xargs命令一块儿使用。例以下面的例子仅搜索C源文件。

    find /home/gigi -name '*.c' -print0 | xargs -0r grep -H 'hello'

    这不一样于下面的命令:

    grep -rH 'hello' *.c

    这仅仅只是搜索当前目录下以".c"结尾的文件。此处的"-r"选项基本上算是多余的,除非当前目录下有以".c"结尾的目录,但这是不多见的状况。上面的find命令更相似于下面的命令:

    grep -rH --include='*.c' 'hello' /home/gigi
  3. 若是pattern以短横线"-"开头会如何?

    grep -e '--cut here--' *

    将搜索"--cut here--"。但若是不给定"-e"选项,grep将可能把"--cut here"解析成一系列的选项。

  4. 如何搜索整个单词,而不是单词中的一部分?

    grep -w 'hello' *

    这将搜索当前目录下全部文件,并找出包含"hello"整个单词的文件,它没法匹配"Othello"。更灵活的控制可使用"\<"和">"来匹配单词的开始和结尾。例如:

    grep 'hello\>' *

    仅搜索"hello"结尾的单词,所以能够匹配"Othello"。

  5. 如何输出匹配行的上下几行?

    grep -C 2 'hello' *

    这将输出匹配行以及它的先后两行。

  6. 如何强制grep即输出匹配行又输出文件名? 只需在文件列表中加上'/dev/null'便可。

    grep 'eli' /etc/passwd /dev/null

    将获得:

    /etc/passwd:eli:x:2098:1000:Eli Smith:/home/eli:/bin/bash

    还可使用GNU扩展选项"-H":

    grep -H 'eli' /etc/passwd
  7. 为何有人在ps的后面使用奇怪的正则表达式?

    ps -ef | grep '[c]ron'

    若是pattern中不加上中括号,将匹配包含cron字符串的进程,包括grep自身,由于grep命令的表达式中包含了cron字符串。但若是加上了中括号,则grep命令行中包含的是"[c]ron"字符串,而grep所匹配的字符串是cron而不是[c]ron。 在输出结果上,这其实等价于下面这条命令:

    ps -ef | grep 'cron' | grep -v 'grep'
  8. 为何grep的结果中会报告"Binary file matches"?
    若是grep列出二进制文件中的全部匹配行,将极可能生成一大堆乱七八糟的无用信息,所以GNU的grep默认禁止这样的输出。若是想要输出二进制内容,使用"-a"或"--binary-files=text"选项。

  9. 为何'grep -lv'输出的是包含非匹配行的文件名?
    'grep -lv'列出的是包含一行或多行非匹配行的文件名。若是想要列出无匹配内容的文件名,则使用"-L"选项。 (注:例如a.txt中一部分行匹配到了,一部分行没匹配到,而b.txt中彻底没有匹配上,则grep -lv将输出a.txt,而不是b.txt。所以可推测"-v"选项的操做优先级要高于"-l",即先搜索出反转行,再输出包含这些反转行的文件)

  10. 使用"|"能够实现or逻辑,如何实现AND逻辑?

    grep 'paul' /etc/motd | grep 'franc,ois'

    将搜索出同时包含"paul"和"franc,ois"的全部行。

  11. 如何同时搜索文件和标准输入?
    只需使用"-"代替标准输入的文件名便可:

    cat /etc/passwd | grep 'alain' - /etc/motd
  12. 正则表达式中如何表达出回文结构?(注:回文结构表示正读和反读的结果是同样的,例如12321,abcba)
    可使用反向引用来实现。例如,一个4字符的结构使用BRE来实现:

    grep -w -e '\(.\)\(.\).\2\1' file

    它能够匹配单词"radar"或"civic"。 Guglielmo Bondioni提出了一个正则表达式,能够搜索长达19个回文结构的字符串,其中使用了9个子表达式和9个反向引用。由于BRE或ERE最多只支持9个反向引用。

    grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file
  13. 为什么反向引用会失效?

    echo 'ba' | grep -E '(a)\1|b\1'

    这不会输出任何内容,由于左边的表达式"(a)\1"没法匹配,由于输入数据中没有"aa",所以右边的"\1"没法引用任何内容,意味着将不匹配任何东西。(此例中右边表达式仅在左边表达式成功匹配时才能生效。)
    注:经测试,即便左边表达式能匹配上,右边表达式中引用左边的分组时也无效。例如"echo 'baaca' | grep -E '(a)\1|c\1'"能够匹配大其中的"aa",但却匹配不到"ca"。

  14. grep如何跨行匹配?
    标准的grep没法实现该功能,由于它是基于行读取的。所以,仅仅使用字符类"[:space:]"没法如你想象中那样匹配换行符。
    GNU的grep有一个选项"-z",它能够处理使用"\0"结尾的行。所以,能够匹配输入数据中的换行符,但一般极可能在输出结果时,输出的是全部内容而不只是被匹配的行,所以常常须要结合输出控制选项如"-q"来使用。例如:

    printf 'foo\nbar\nabc' | grep -z 'foo[[:space:]]\+bar'
    printf 'foo\nbar\nabc' | grep -z -q 'foo[[:space:]]\+bar'

    若是这还不知足需求,能够将输入数据进行格式转换而后交给grep,或者使用其余工具替代grep,如"sed"、"awk"、"perl"或其余不少工具都能跨行操做。

  15. What do 'grep', 'fgrep', and 'egrep' stand for?
    The name 'grep' comes from the way line editing was done on Unix. For example, 'ed' uses the following syntax to print a list of matching lines on the screen:

    global/regular expression/print  
    g/re/p

    'fgrep' stands for Fixed 'grep'; 'egrep' stands for Extended 'grep'.

5 Known Bugs(已知的一些bug)


当"{n,m}"指定的重复次数不少时,将致使grep消耗大量内存。此外,越模糊的正则表达式消耗的时间和空间越多,也会让grep消耗大量内存。 反向引用的功能很是慢,所以可能会消耗大量时间。 (注:递归搜索时,也会消耗巨量的内存,很容易提示内存溢出错误而提早退出。)

相关文章
相关标签/搜索