grep 命令的使用

grep 命令

用途

在文件中搜索模式。

语法

grep [ -E | -F ] [ -i ] [ -h ] [ -H ] [ -L ] [ -r | -r ] [ -s ] [ -v ] [ -w ] [ -x ] [ -y ] [ [ [ -b ] [ -n ] ] | [ -c | -l | -q ] ] [ -p [ Separator ] ] { [ -e PatternList … ] [ -f PatternFile … ] | PatternList … } [ File … ]

描述

grep 命令用于搜索由 Pattern 参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用 ed egrep 命令样式。grep 命令使用压缩的不确定算法。

如果在 File 参数中指定了多个名称,grep 命令将显示包含匹配行的文件的名称。对 shell 有特殊含义的字符 ($, , [, |, ^, (, ), ) 出现在 Pattern 参数中时必须带双引号。如果 Pattern 参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z] 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理顺序可以定义等价的类以供在字符范围中使用。如果未指定任何文件,*grep 会假定为标准输入。

注:

  1. 请勿对特殊文件运行 grep 命令,这样做可能产生不可预计的结果。
  2. 输入行不应包含空字符。
  3. 输入文件应该以换行符结束。
  4. 换行符不会与正则表达式匹配。
  5. 虽然一些标志可以同时被指定,但其中的某些标志会覆盖其他标志。例如,-l 选项将优先于所有其他标志。另外,如果您同时指定了 -E-F 标志,则后指定的那个会有优先权。

标志

-b

在每行之前添加找到该行时所在的块编号。使用这个标志有助于通过上下文来找到磁盘块号码。-b 标志不能用于来自标准输入和管道的输入。

-c

仅显示匹配行的计数。

-E

将每个指定模式视作扩展的正则表达式(ERE)。ERE 的空值将匹配所有的行。

注:带有 -E 标志的 grep 命令等价于 egrep 命令,只不过它们的错误和使用信息不同以及 -s 标志的作用不同。

-e PatternList

指定一个或多个搜索模式。其作用相当于一个简单模式,但在模式以 -(减号)开始的情况下,这将非常有用。模式之间应该用换行符分隔。连续使用两个换行符或者在引号后加上换行符 (”n) 可以指定空模式。除非同时指定了 -E-F 标志,否则每个模式都将被视作基本正则表达式(BRE)。grep 可接受多个 -e-f 标志。在匹配行时,所有指定的模式都将被使用,但评估的顺序没有指定。

-F

将每个指定的模式视作字符串而不是正则表达式。空字符串可匹配所有的行。
注: 带有 -F 标志的 grep 命令等价于 fgrep 命令,只不过它们的错误和使用信息不同以及 -s 标志具有不同的作用。

-f PatternFile

指定包含搜索模式的文件。模式之间应该用换行符加以分隔,空行将被认为是空模式。每种模式都将被视作基本的正则表达式(BRE),除非同时指定了 -E-F 标志。

-h

禁止在匹配行后附加包含此行的文件的名称。当指定多个文件时,将禁止文件名。

-H

如果指定了 -r-R 选项并且在命令行上指定了引用文件类型目录的符号链接,则 grep 将搜索符号链接所引用的目录文件以及文件层次结构中在它以下的所有文件。

-i

在进行比较时忽略字母的大小写。


-l

仅列出(一次)包含匹配行的文件的名称。文件名之间用换行符加以分隔。如果搜索到标准输入,将返回(标准输入)的路径名。-l 标志同 -c-n 标志的任意组合一起使用时,其作用类似于仅使用了 -l 标志。

-L

如果指定了 -r-R 选项,并且引用文件类型目录的符号链接在命令行上指定或在文件层次结构转移过程中遇到,则 grep 将搜索符号链接所引用的目录文件以及文件层次结构中在它以下的所有文件。如果同时指定了 -H-L,则命令行上最近指定的选项将生效。

-n

在每一行之前放置文件中相关的行号。每个文件的起始行号为 1,在处理每个文件时,行计数器都将被复位。

-p[ Separator]

显示包含匹配行的整个段落。段落之间将按照 Separator 参数指定的段落分隔符加以分隔,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符,它们不会被包含在输出中。缺省的段落分隔符是空白行。

-q

禁止所有写入到标准输出的操作,不管是否为匹配行。如果选择了输入行,则以零状态退出。-q 标志同 -c-l-n 标志的任意组合一起使用时,其作用类似于仅使用了 -q 标志。

-r

递归地搜索目录。在缺省情况下,按照到目录的链接。

-r

递归地搜索目录。在缺省情况下,不按照到目录的链接。

-s

禁止通常因为文件不存在或不可读取而写入的错误信息。其他的错误信息并未被禁止。

-v

显示所有与指定模式不匹配的行。

-w

执行单词搜索。

-x

显示与指定模式精确匹配而不含其他字符的行。

-y

当进行比较时忽略字符的大小写。

PatternList

指定将在搜索中使用的一个或多个模式。这些模式将被视作如同是使用 -e 标志指定的。

File

指定将对其进行模式搜索的文件的名称。如果未给出 File 变量,将使用标准输入。


退出状态

此命令返回以下出口值:

0

找到匹配项。

1

未找到匹配项。

>1

发现语法错误,或者文件不可访问(即使找到了匹配项)。


示例

  1. 若使用包含以下模式匹配字符的模式:*, ^, ?, [, ], (, ), { 和 },请输入:

    grep  “^[a-zA-Z]”  pgm.s

    这将显示 pgm.s 中第一个字符为字母的所有行。

  2. 若显示所有与模式不匹配的行,请输入:

grep -v “^#” pgm.s
这将显示 <tt><span style="font-family: 新宋体">pgm.s</span></tt> 中首字母不是 <tt><span style="font-family: 新宋体">#</span></tt>(井字符)的所有行。
  1. 若显示文件 file1 中与abcxyz 字符串匹配的所有行,请输入:
grep -E “abc|xyz” file1
  1. 若在名为 test2 的文件中搜索 $(美元符号),请输入:
    grep $ test2

为了强制 shell 将 $(单反斜杠和美元符号)传递给 grep 命令,必须要使用 \(双反斜杠)。(单反斜杠)字符可通知 grep 命令将其后的字符(本例中为 $)视作原义字符而不是表达式字符。如果使用 fgrep 命令,则可以不必使用反斜杠之类的转义字符。

  1. 通过 /tmp 递归地搜索以找到含有字 IBM 的文件,而不是通过指向目录的链接进行递归搜索,请输入:

    grep –R IBM /tmp
    grep –r -H IBM /tmp
  2. 要通过 /tmp 递归地搜索以找到含有词 IBM 的文件,同时也通过链接进行递归搜索,请输入:

    grep –r IBM /tmp
    grep -R -L IBM /tmp