grep
是一个强大的文本搜索工具,最初为 Unix 系统开发,现在广泛应用于各种类 Unix 系统(如 Linux 和 macOS)中。它通过正则表达式来搜索文件中的文本,并打印出所有包含匹配文本的行。grep
命令的名字来源于 ed 文本编辑器中的 g/re/p
(全局匹配/正则表达式/打印),意指“全局搜索并打印”。
基本语法
grep [选项] 模式 [文件...]
grep [选项] -e 模式 | -f 文件 [文件...]
描述
grep
是一个用于文本搜索的命令行工具,支持通过正则表达式或固定字符串匹配文本行。其核心功能包括:
- 模式匹配:在文件或标准输入中查找匹配指定模式的行。
- 多模式匹配:通过
-e
或-f
指定多个模式或从文件读取模式。 - 输出控制:可选择显示匹配行、统计匹配数、仅显示文件名等。
egrep
和 fgrep
的替代方式:
egrep
等同于grep -E
(启用扩展正则表达式)。fgrep
等同于grep -F
(固定字符串匹配)。- 注意:直接调用
egrep
或fgrep
已不推荐,但为兼容旧程序保留。
选项
通用选项
选项 | 描述 |
---|---|
-h, --help | 显示简短帮助信息并退出。 |
-V, --version | 显示 grep 版本号。 |
模式类型控制
选项 | 描述 |
---|---|
-E, --extended-regexp | 启用扩展正则表达式(ERE)。 |
-F, --fixed-strings | 将模式视为固定字符串列表(每行一个)。 |
-G, --basic-regexp | 使用基础正则表达式(默认)。 |
-P, --perl-regexp | 使用 Perl 兼容正则表达式(实验性)。 |
匹配控制
选项 | 描述 |
---|---|
-e 模式, --regexp=模式 | 指定搜索模式(可多次使用)。 |
-f 文件, --file=文件 | 从文件中读取模式(每行一个)。 |
-i, --ignore-case | 忽略大小写。 |
-v, --invert-match | 反向匹配(显示不匹配的行)。 |
-w, --word-regexp | 匹配完整单词(如 grep -w foo 匹配 foo 但不匹配 foobar )。 |
-x, --line-regexp | 匹配整行(如 grep -x 'abc' 仅匹配完全等于 abc 的行)。 |
输出控制
选项 | 描述 |
---|---|
-c, --count | 仅统计匹配行数。 |
--color[=WHEN] | 高亮显示匹配文本(WHEN 可为 always , never , auto )。 |
-L, --files-without-match | 仅列出无匹配的文件名。 |
-l, --files-with-matches | 仅列出有匹配的文件名。 |
-m 数字, --max-count=数字 | 匹配到指定数量后停止。 |
-o, --only-matching | 仅输出匹配的文本片段。 |
-q, --quiet, --silent | 静默模式(匹配时返回 0,无输出)。 |
-s, --no-messages | 抑制错误信息(如文件不存在)。 |
输出格式控制
选项 | 描述 |
---|---|
-b, --byte-offset | 显示匹配行的字节偏移量(从 0 开始)。 |
-H, --with-filename | 强制显示文件名(当搜索多个文件时默认开启)。 |
-h, --no-filename | 隐藏文件名(当搜索单个文件时默认开启)。 |
-n, --line-number | 显示匹配行的行号。 |
-T, --initial-tab | 对齐输出(确保列对齐,如配合 -n 使用)。 |
-Z, --null | 用空字符分隔文件名(适合管道处理)。 |
上下文控制
选项 | 描述 |
---|---|
-A 数字, --after-context=数字 | 显示匹配行后的 数字 行。 |
-B 数字, --before-context=数字 | 显示匹配行前的 数字 行。 |
-C 数字, -NUM, --context=数字 | 显示匹配行前后各 数字 行。 |
--group-separator=分隔符 | 自定义分组间的分隔符(默认 -- )。 |
文件与目录选择
选项 | 描述 |
---|---|
-a, --text | 将二进制文件视为文本处理。 |
--binary-files=类型 | 控制二进制文件的处理方式(binary 显示警告,without-match 跳过)。 |
退出状态
状态码 | 含义 |
---|---|
0 | 成功找到匹配。 |
1 | 未找到匹配。 |
2 | 命令行参数错误、权限问题或内部错误。 |
示例
示例 1:基本搜索
grep "error" /var/log/syslog
# 在 syslog 文件中搜索包含 "error" 的行。
示例 2:统计匹配行数
grep -c "warning" /var/log/messages
# 输出包含 "warning" 的行数。
示例 3:反向匹配
grep -v "success" results.txt
# 显示不包含 "success" 的行。
示例 4:高亮显示匹配
grep --color=always "pattern" file.txt
# 高亮显示匹配文本。
示例 5:多模式匹配
grep -E "error|fail" /var/log/app.log
# 使用扩展正则表达式匹配 "error" 或 "fail"。
示例 6:仅显示文件名
grep -l "TODO" *.c
# 列出所有包含 "TODO" 的 C 文件。
常见问题
Q: 如何匹配包含换行符的文本?
A:
使用 -z
选项将输入视为 NUL 分隔的记录,例如:
grep -zPzo 'pattern.*' file.txt
Q: 如何在多个文件中搜索并显示文件名?
A:
使用 -H
强制显示文件名:
grep -H "pattern" file1 file2
Q: egrep
和 grep -E
的区别?
A:
无区别,egrep
是 grep -E
的别名,但直接调用 egrep
已不推荐。
Q: 如何禁用颜色输出?
A:
设置环境变量或使用 --color=never
:
GREP_OPTIONS='--color=never' grep "pattern" file
注意事项
-
正则表达式类型:
- 基础正则表达式(BRE):默认模式,特殊字符需转义(如
.
需写成\.
)。 - 扩展正则表达式(ERE):启用
-E
后,可直接使用|
,?
,+
等符号。
- 基础正则表达式(BRE):默认模式,特殊字符需转义(如
-
二进制文件处理:
- 默认对二进制文件输出警告,使用
--binary-files=without-match
可跳过此类文件。
- 默认对二进制文件输出警告,使用
-
静默模式:
-q
用于脚本中检测匹配是否存在(如grep -q "keyword" file && echo "Found"
)。
-
管道与文件名处理:
-Z
选项结合xargs -0
可处理含特殊字符的文件名。