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

反向引用"\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时常见的问题和答案。

如何列出匹配的文件名?

grep -l 'main' *.c

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

如何递归搜索目录?

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

如果pattern以短横线"-"开头会如何?

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

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

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

grep -w 'hello' *

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

grep 'hello\>' *

仅搜索"hello"结尾的单词,因此可以匹配"Othello"。

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

grep -C 2 'hello' *

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

如何强制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

为什么有人在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'

为什么grep的结果中会报告"Binary file matches"?
如果grep列出二进制文件中的所有匹配行,将很可能生成一大堆乱七八糟的无用信息,因此GNU的grep默认禁止这样的输出。如果想要输出二进制内容,使用"-a"或"--binary-files=text"选项。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13491.html