> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/man/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)](/man/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。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/man/man1/grep.1.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
