> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/grep.1.md).

# egrep(1)

`grep` — 文件模式搜索器

## 名称

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

## 概要

`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]`

## 描述

`grep` 实用程序搜索任何给定的输入文件，选择匹配一个或多个模式的行。默认情况下，如果模式中的正则表达式（RE）匹配输入行（不含其末尾换行符），则该模式匹配此输入行。空表达式匹配每一行。每个至少匹配其中一个模式的输入行都会被写入标准输出。

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

可用选项如下：

**`-A`** `num`, **`--after-context=`**`num` 在每次匹配之后打印 `num` 行的尾随上下文。另请参见 `-B` 和 `-C` 选项。

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

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

**`-b`**, **`--byte-offset`** 在匹配行之前显示匹配模式的字节偏移量。

**`-C`** `num`, **`--context=`**`num` 打印每次匹配周围 `num` 行的前导和尾随上下文。另请参见 `-A` 和 `-B` 选项。

**`-c`**, **`--count`** 仅将选中行的计数写入标准输出。

**`--colour=`**\[`when`], **`--color=`**\[`when`] 用 `GREP_COLOR` 环境变量中存储的表达式标记匹配文本。`when` 的可能值为 “`never`”、“`always`” 和 “`auto`”。

**`-D`** `action`, **`--devices=`**`action` 为设备、FIFO 和套接字指定所需的 `action`。默认 `action` 为 “`read`”，即将它们当作普通文件一样读取。如果 `action` 设为 “`skip`”，则静默跳过设备。

**`-d`** `action`, **`--directories=`**`action` 为目录指定所需的 `action`。默认为 “`read`”，即以与普通文件相同的方式读取目录。其他可能的值为 “`skip`”（静默忽略目录）和 “`recurse`”（递归读取，与 `-R` 和 `-r` 选项效果相同）。

**`-E`**, **`--extended-regexp`** 将 `pattern` 解释为扩展正则表达式（即强制 `grep` 表现为 `egrep`）。

**`-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`**, **`--fixed-strings`** 将 `pattern` 解释为一组固定字符串（即强制 `grep` 表现为 `fgrep`）。

**`-f`** `file`, **`--file=`**`file` 从 `file` 中读取一个或多个以换行符分隔的模式。空模式行匹配每个输入行。换行符不被视为模式的一部分。如果 `file` 为空，则不匹配任何内容。

**`-G`**, **`--basic-regexp`** 将 `pattern` 解释为基本正则表达式（即强制 `grep` 表现为传统 `grep`）。

**`-H`** 始终在输出行前打印文件名头。

**`-h`**, **`--no-filename`** 从不在输出行前打印文件名头（即文件名）。

**`--help`** 打印简短的帮助信息。

**`-I`** 忽略二进制文件。此选项等价于 “`--binary-files=without-match`” 选项。

**`-i`**, **`--ignore-case`** 执行不区分大小写的匹配。默认情况下，`grep` 区分大小写。

**`--include`** `pattern` 如果指定，则仅搜索匹配给定文件名 `pattern` 的文件。注意，`--include` 和 `--exclude` 模式按给定顺序处理。如果名称匹配多个模式，以最后匹配的规则为准。模式与完整路径匹配，而不仅仅是文件名部分。

**`--include-dir`** `pattern` 如果指定了 `-R`，则仅搜索匹配给定文件名 `pattern` 的目录。注意，`--include-dir` 和 `--exclude-dir` 模式按给定顺序处理。如果名称匹配多个模式，以最后匹配的规则为准。

**`-L`**, **`--files-without-match`** 仅将不包含选中行的文件名写入标准输出。每个被搜索文件的路径名列出一次。如果搜索的是标准输入，则写入字符串 “(standard input)”，除非指定了 `--label`。

**`-l`**, **`--files-with-matches`** 仅将包含选中行的文件名写入标准输出。`grep` 在找到匹配后即停止搜索该文件，可使搜索开销更小。每个被搜索文件的路径名列出一次。如果搜索的是标准输入，则写入字符串 “(standard input)”，除非指定了 `--label`。

**`--label`** 在通常会打印文件名之处，用以代替 “(standard input)” 的标签。此选项适用于 `-H`、`-L` 和 `-l`。

**`--mmap`** 使用 mmap(2) 而非 read(2) 读取输入，在某些情况下可获得更好的性能，但也可能导致未定义行为。

**`-m`** `num`, **`--max-count=`**`num` 在 `num` 次匹配后停止读取文件。

**`-n`**, **`--line-number`** 每个输出行前加上其在文件中的相对行号，从第 1 行开始。每处理一个文件，行号计数器会重置。如果指定了 `-c`、`-L`、`-l` 或 `-q`，则忽略此选项。

**`--null`** 在文件名后打印一个零字节。

**`-O`** 如果指定了 `-R`，仅当符号链接在命令行上被显式列出时才跟随。默认为不跟随符号链接。

**`-o`**, **`--only-matching`** 仅打印行中匹配的部分。

**`-p`** 如果指定了 `-R`，不跟随任何符号链接。此为默认行为。

**`-q`**, **`--quiet`**, **`--silent`** 安静模式：抑制正常输出。`grep` 在找到匹配后即停止搜索该文件，可使搜索开销更小。

**`-R`**, **`-r`**, **`--recursive`** 递归搜索列出的子目录。（即强制 `grep` 表现为 `rgrep`）。

**`-S`** 如果指定了 `-R`，跟随所有符号链接。默认为不跟随符号链接。

**`-s`**, **`--no-messages`** 静默模式。不存在的和不可读的文件会被忽略（即抑制其错误信息）。

**`-U`**, **`--binary`** 搜索二进制文件，但不尝试打印它们。

**`-u`** 此选项无效，仅为与 GNU grep 兼容而提供。

**`-V`**, **`--version`** 显示版本信息并退出。

**`-v`**, **`--invert-match`** 选中的行是那些*不*匹配任何指定模式的行。

**`-w`**, **`--word-regexp`** 将表达式作为单词搜索（如同被 `[[:<:]]` 和 `[[:>:]]` 包围；参见 re\_format(7)）。如果还指定了 `-x`，此选项无效。

**`-x`**, **`--line-regexp`** 仅当输入行与整个固定字符串或正则表达式匹配时才被视为匹配行。

**`-y`** 等价于 `-i`。已弃用。

**`-z`**, **`--null-data`** 将输入和输出数据视为以零字节而非换行符终止的行序列。

**`--binary-files=`**`value` 控制二进制文件的搜索和打印。选项为：

**`binary`**（默认）搜索二进制文件但不打印它们。

**`without-match`** 不搜索二进制文件。

**`text`** 将所有文件视为文本。

**`--line-buffered`** 强制输出为行缓冲。默认情况下，当标准输出为终端时输出为行缓冲，否则为块缓冲。

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

## 环境变量

以下环境变量影响 `grep` 的执行：

**`GREP_COLOR`** 此变量指定用于高亮显示匹配（非空）文本的颜色。

**`GREP_OPTIONS`** 此变量指定要放在任何显式选项之前的默认选项。它可能导致可移植脚本出现问题。

**`TERM`** 此变量指定要使用的终端、控制台或显示设备类型的类型名。参见 term(7)。

## 退出状态

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

**`0`** 选中了一行或多行。

**`1`** 未选中任何行。

**`>1`** 发生了错误。

## 实例

在文件中查找模式 ‘patricia’ 的所有出现：

```sh
$ grep 'patricia' myfile
```

同上，但仅查找完整单词：

```sh
$ grep -w 'patricia' myfile
```

计算精确模式 ‘FOO’ 的出现次数：

```sh
$ grep -c FOO myfile
```

同上，但不区分大小写：

```sh
$ grep -c -i FOO myfile
```

查找模式 `.Pp` 在行首的所有出现：

```sh
$ grep '^\.Pp' myfile
```

单引号确保整个表达式由 `grep` 而非用户的 shell 求值。脱字符 `^` 匹配行首的空字符串，而 `\` 转义了 `.`，否则 `.` 会匹配任意字符。

查找文件中所有不包含单词 ‘foo’ 或 ‘bar’ 的行：

```sh
$ grep -v -e 'foo' -e 'bar' myfile
```

使用扩展正则表达式浏览文件 ‘calendar’，查找 19、20 或 25：

```sh
$ egrep '19|20|25' calendar
```

显示匹配行及包含模式 ‘FIXME’ 的 ‘\*.h’ 文件名。从 **`/usr/src/sys/arm`** 目录递归搜索：

```sh
$ grep -H -R FIXME --include="*.h" /usr/src/sys/arm/
```

同上，但仅显示匹配文件的文件名：

```sh
$ grep -l -R FIXME --include="*.h" /usr/src/sys/arm/
```

显示包含文本 ‘foo’ 的行。输出的匹配部分被着色，每个匹配行前加上行号和该行在文件中的偏移量：

```sh
$ grep -b --colour -n foo myfile
```

显示匹配从标准输入读取的扩展正则表达式模式的行：

```sh
$ echo -e 'Free\nBSD\nAll.*reserved' | grep -E -f - myfile
```

显示 pciconf(8) 命令输出中匹配指定扩展正则表达式的行，以及前三行前导上下文和一行尾随上下文：

```sh
$ pciconf -lv | grep -B3 -A1 -E 'class.*=.*storage'
```

抑制任何输出，并使用退出状态显示适当的消息：

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

## 参见

ed(1), ex(1), [sed(1)](/man1/sed.1.md), zgrep(1), re\_format(7)

## 标准

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

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

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

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

## 历史

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