# grep.1

GREP(1)

GREP(1)

FreeBSD General Commands Manual

GREP(1)

## [名称](#__u540D___u79F0_)

`grep`, `egrep`, `fgrep`, `rgrep` —

文件模式搜索器

## [概要](#__u6982___u8981_)

`grep` \[`-abcdDEFGHhIiLlmnOopqRSsUVvwxz`] \[`-A` num] \[`-B` num] \[`-C`\[num]] \[`-e` pattern] \[`-f` file] \[`-``-binary-files=`value] \[`-``-color`\[`=`when]] \[`-``-colour`\[`=`when]] \[`-``-context`\[`=`num]] \[`-``-label`] \[`-` `-line-buffered`] \[`-``-null`] \[pattern] \[file ...]

## [描述](#__u63CF___u8FF0_)

`grep` 实用程序搜索任何给定的输入文件，选择匹配一个或多个模式的行。 默认情况下，如果模式中的正则表达式 (RE) 匹配输入行而没有尾随换行符，则该模式匹配输入行。 空表达式匹配每一行。 与至少一种模式匹配的每个输入行都被写入标准输出。

`grep` 用于简单模式和基本正则表达式 (BREs); `egrep` 可以处理扩展正则表达式 (ERE) 。 有关正则表达式的更多信息，请参阅 re\_format(7) 。 `fgrep` 比 `grep` 和 `egrep` 都快，但只能处理固定模式（即，它不解释正则表达式）。 模式可以由一行或多行组成，允许任何模式行匹配输入的一部分。

可以使用以下选项：

[`-A`](#A) num, `-``-after-context=`num

每次匹配后打印 num 行尾随上下文。 另请参见 `-B` 和 `-C` 选项。

[`-a`](#a), `-``-text`

将所有文件视为 ASCII 文本。 如果文件包含二进制字符，通常 `grep` 将简单地打印 “Binary file ... matches” 。 使用此选项会强制 `grep` 输出与指定模式匹配的行。

[`-B`](#B) num, `-``-before-context=`num

在每次匹配之前打印前导上下文的 num 行。 另请参见 `-A` 和 `-C` 选项。

[`-b`](#b), `-``-byte-offset`

匹配模式的字节偏移量显示在相应匹配行的前面。

[`-C`](#C)\[num], `-``-context`\[=num]

打印围绕每个匹配项的前导和尾随上下文的 num 行。 num 的默认值为 “2” ，相当于 “`-A` 2 `-B` 2” 。 注意：选项和它的参数之间不能有空格。

[`-c`](#c), `-``-count`

只有选定的行数被写入标准输出。

`-``-colour=`\[when], `-``-color=`\[when]

使用 `GREP_COLOR` 环境变量中存储的表达式标记匹配文本。 when 的可能值是 “`never`”, “`always`” 和 “`auto`” 。

[`-D`](#D) action, `-``-devices=`action

为设备、FIFO 和套接字指定所需的 action 。 默认 action 是 “`read`” ，这意味着它们像普通文件一样被读取。 如果 action 设置为 “`skip`” ，设备将被静默跳过。

[`-d`](#d) action, `-``-directories=`action

指定目录所需的 action 。 默认为 “`read`” ，这意味着目录的读取方式与普通文件相同。 其他可能的值是 “`skip`” 以静默忽略目录， “`recurse`” 以递归方式读取它们，这与 `-R` 和 `-r` 选项的效果相同。

[`-E`](#E), `-``-extended-regexp`

将 pattern 为扩展的正则表达式（即，强制 `grep` 表现为 `egrep` )。

[`-e`](#e) pattern, `-``-regexp=`pattern

指定在搜索输入期间使用的 pattern ：如果输入行匹配任何指定的模式，则选择该输入行。 当使用多个 `-e` 选项指定多个模式时，或者当一个 pattern 以破折号 (‘-’) 开头时，此选项最有用。

`-``-exclude` pattern

如果指定，它将从搜索中排除与给定文件名 pattern 匹配的文件。 请注意， `-``-exclude` 和 `-``-include` 模式是按给定的顺序处理的。 如果一个名称匹配多个模式，则最新的匹配规则获胜。 如果未指定 `-``-include` 模式，则搜索所有未排除的文件。 模式与指定的完整路径匹配，而不仅仅是文件名组件。

`-``-exclude-dir` pattern

如果指定了 `-R` ，它将从搜索中排除与给定文件名 pattern 匹配的目录。 请注意， `-``-exclude-dir` 和 `-``-include-dir` 模式是按照给定的顺序处理的。 如果一个名称匹配多个模式，则最新的匹配规则获胜。 如果未指定 `-``-include-dir` 模式，则搜索所有未排除的目录。

[`-F`](#F), `-``-fixed-strings`

将 pattern 解释为一组固定字符串（即强制 `grep` 表现为 `fgrep` )。

[`-f`](#f) file, `-``-file=`file

从 file 中读取一个或多个换行符分隔的模式。空模式行匹配每个输入行。 换行符不被视为模式的一部分。 如果 file 为空，则不匹配。

[`-G`](#G), `-``-basic-regexp`

将 pattern 解释为基本的正则表达式（即强制 `grep` 表现得像传统的 `grep` )。

[`-H`](#H)

始终使用输出行打印文件名标题。

[`-h`](#h), `-``-no-filename`

切勿使用输出行打印文件名标题 (即 filenames) 。

`-``-help`

打印简短的帮助信息。

[`-I`](#I)

忽略二进制文件。 此选项等效于 “`-``-binary-file=``without-match`” 选项。

[`-i`](#i), `-``-ignore-case`

执行不区分大小写的匹配。 默认情况下， `grep` 区分大小写。

`-``-include` pattern

如果指定，则仅搜索与给定文件名 pattern 匹配的文件。 请注意， `-``-include` 和 `-``-exclude` 模式是按照给定的顺序处理的。 如果一个名称匹配多个模式，则最新的匹配规则获胜。 模式与指定的完整路径匹配，而不仅仅是文件名组件。

`-``-include-dir` pattern

如果指定了 `-R` ，则仅搜索与给定文件名 pattern 匹配的目录。 请注意， `-``-include-dir` 和 `-``-exclude-dir` 模式是按照给定的顺序处理的。 如果一个名称匹配多个模式，则最新的匹配规则获胜。

[`-L`](#L), `-``-files-without-match`

只有不包含所选行的文件名才会写入标准输出。 每个搜索的文件都会列出一次路径名。 如果搜索标准输入，则写入字符串 “(standard input)” ，除非指定 `-``-label` 。

[`-l`](#l), `-``-files-with-matches`

只有包含选定行的文件名被写入标准输出。 `grep` 只会在找到匹配项之前搜索文件，从而降低搜索成本。 每个搜索的文件都会列出一次路径名。 如果搜索标准输入，则写入字符串 “(standard input)” ，除非指定 `-``-label` 。

`-``-label`

用于代替 “(standard input)” 的标签，用于通常打印文件名的文件名。 此选项适用于 `-H`, `-L` 和 `-l` 。

`-``-mmap`

使用 mmap(2) 而不是 read(2) 来读取输入，这在某些情况下可能会带来更好的性能，但可能会导致未定义的行为。

[`-m`](#m) num, `-``-max-count=`num

在 num 匹配后停止读取文件。

[`-n`](#n), `-``-line-number`

每个输出行前面都有其在文件中的相对行号，从第 1 行开始。 为每个处理的文件重置行号计数器。 如果指定了 `-c`, `-L`, `-l` 或 `-q` ，则忽略此选项。

`-``-null`

在文件名之后打印一个零字节。

[`-O`](#O)

如果指定了 `-R` ，则仅当符号链接在命令行上明确列出时才跟随它们。 默认不遵循符号链接。

[`-o`](#o), `-``-only-matching`

仅打印行的匹配部分。

[`-p`](#p)

如果指定了 `-R` ，则不遵循任何符号链接。 这是默认设置。

[`-q`](#q), `-``-quiet`, `-` `-silent`

安静模式：抑制正常输出。 `grep` 只会在找到匹配项之前搜索文件，从而降低搜索成本。

[`-R`](#R), `-r`, `-``-recursive`

递归搜索列出的子目录。 （即，强制 `grep` 表现为 `rgrep` )。

[`-S`](#S)

如果指定了 `-R` ，则遵循所有符号链接。 默认不遵循符号链接。

[`-s`](#s), `-``-no-messages`

静音模式。 不存在和不可读的文件被忽略（即，它们的错误消息被抑制）。

[`-U`](#U), `-``-binary`

搜索二进制文件，但不要尝试打印它们。

[`-u`](#u)

此选项无效，仅用于与 GNU grep 兼容。

[`-V`](#V), `-``-version`

显示版本信息并退出。

[`-v`](#v), `-``-invert-match`

选定的行是那些 *不* 匹配任何指定模式的行。

[`-w`](#w), `-``-word-regexp`

表达式作为一个词被搜索（好像被 ‘\[\[:<:]]’ 和 ‘\[\[:>:]]’ 包围；参见 re\_format(7) )。

[`-x`](#x), `-``-line-regexp`

只有针对整个固定字符串或正则表达式选择的输入行才被视为匹配行。

[`-y`](#y)

相当于 `-i` 。已过时。

[`-z`](#z), `-``-null-data`

将输入和输出数据视为以零字节而不是换行符结尾的行序列。

`-``-binary-files=`value

控制二进制文件的搜索和打印。选项是：

[`binary`](#binary) (default)

搜索二进制文件但不打印它们。

[`without-match`](#without-match)

不要搜索二进制文件。

[`text`](#text)

将所有文件视为文本。

`-``-line-buffered`

强制输出为行缓冲。 默认情况下，当标准输出是终端时输出是行缓冲的，否则是块缓冲的。

如果没有指定文件参数，则使用标准输入。 此外， “`-`” 可以用来代替文件名，在任何接受文件名的地方，以从标准输入中读取。 这包括 `-f` 和文件参数。

## [退出状态](#__u9000___u51FA___u72B6___u6001_)

`grep` 实用程序以下列值之一退出：

[`0`](#0)

选择了一条或多条线。

[`1`](#1)

未选择任何行。

[`>1`](#_1)

发生错误。

## [实例](#__u5B9E___u4F8B_)

* 查找文件中所有出现的模式 ‘patricia’ :

  `$ grep 'patricia' myfile`
* 与上面相同，但只查找完整的单词：

  `$ grep -w 'patricia' myfile`
* 计算确切模式 ‘FOO’ 的出现次数：

  `$ grep -c FOO myfile`
* 与上面相同，但忽略大小写：

  `$ grep -c -i FOO myfile`
* 在行首查找所有出现的模式 ‘`.Pp`’ :

  `$ grep '^\.Pp' myfile`

  撇号确保整个表达式由 `grep` 而不是用户的 shell 评估。 插入符号 ‘`^`’ 匹配行首的空字符串，而 ‘`\`’ 转义 ‘`.`’, 否则将匹配任何字符。
* 查找文件中不包含单词 ‘foo’ 或 ‘bar’ 的所有行：

  `$ grep -v -e 'foo' -e 'bar' myfile`
* 使用扩展正则表达式仔细阅读文件 ‘calendar’ 以查找 19、20 或 25：

  `$ egrep '19|20|25' calendar`
* 显示匹配行和包含模式 ‘FIXME’ 的 ‘\*.h’ 文件的名称。 从 /usr/src/sys/arm 目录递归搜索

  `$ grep -H -R FIXME --include=*.h /usr/src/sys/arm/`
* 与上面相同，但仅显示匹配文件的名称：

  `$ grep -l -R FIXME --include=*.h /usr/src/sys/arm/`
* 显示包含文本 ‘foo’ 的行。 输出的匹配部分是彩色的，每一行都以行号和匹配行的文件中的偏移量作为前缀。

  `$ grep -b --colour -n foo myfile`
* 显示与从标准输入读取的扩展正则表达式模式匹配的行：

  `$ echo -e 'Free\nBSD\nAll.*reserved' | grep -E -f - myfile`
* 显示 pciconf(8) 命令输出中与指定扩展正则表达式匹配的行以及三行前导上下文和一行尾随上下文：

  `$ pciconf -lv | grep -B3 -A1 -E 'class.*=.*storage'`
* 抑制任何输出并使用退出状态显示适当的消息：

  `$ grep -q foo myfile && echo File matches`

## [参见](#__u53C2___u89C1_)

ed(1), ex(1), sed(1), zgrep(1), re\_format(7)

## [标准](#__u6807___u51C6_)

`grep` 实用程序符合 IEEE Std 1003.1-2008 (“POSIX.1”) 规范。

标志 \[`-AaBbCDdGHhILmoPRSUVw`] 是该规范的扩展，当与空模式文件一起使用时 `-f` 标志的行为未定义。

提供所有长选项是为了与该实用程序的 GNU 版本兼容。

`grep` 实用程序的历史版本也支持标志 \[`-ruy`] 。此实现支持这些选项；但是，强烈建议不要使用它们。

## [历史](#__u5386___u53F2_)

`grep` 命令首次出现在 Version 6 AT\&T UNIX 中。

November 19, 2020

FreeBSD 13.1-RELEASE
