Linux 系统中的 egrep 命令是 grep 家族中的重要成员,它等同于 grep -E,即支持扩展正则表达式(Extended Regular Expression, ERE),相较于基础 grep 命令,egrep 在模式匹配的灵活性和功能上更加强大,能够通过正则表达式实现复杂的文本搜索、过滤和分析任务,本文将详细介绍 egrep 命令的语法、核心功能、常用选项、实际应用场景,并通过示例帮助读者深入理解其使用方法。

egrep 命令的基本语法
egrep 命令的基本语法结构如下:
egrep [选项] '模式' [文件名...]
- 选项:控制命令的行为,如忽略大小写、显示行号等;
- 模式:使用扩展正则表达式描述的匹配规则,是 egrep 的核心;
- 文件名:可选参数,指定要搜索的文件,若未指定文件,egrep 会从标准输入(如管道输入)读取数据。
扩展正则表达式的核心特性
egrep 的强大之处在于其对扩展正则表达式的支持,与基础正则表达式(BRE)相比,扩展正则表达式新增了更多元字符和语法,简化了复杂模式的编写,以下是常用的扩展正则表达式元字符及其含义:
| 元字符 | 功能描述 | 示例 | 匹配结果 |
|---|---|---|---|
| 逻辑“或”,匹配多个模式中的任意一个 | egrep 'apple\|banana' file.txt |
匹配包含 "apple" 或 "banana" 的行 | |
| 匹配前一个字符或子表达式 1 次或多次 | egrep 'go+l' file.txt |
匹配 "gol"、"gool"、"gooool" 等 | |
| 匹配前一个字符或子表达式 0 次或 1 次 | egrep 'colou?r' file.txt |
匹配 "color" 或 "colour" | |
{n,m} |
匹配前一个字符或子表达式至少 n 次,最多 m 次 | egrep 'a{2,4}' file.txt |
匹配 "aa"、"aaa"、"aaaa" |
| 分组,将多个字符视为一个整体 | egrep '(ab)+c' file.txt |
匹配 "abc"、"ababc" 等 | |
^ |
匹配行的开头 | egrep '^root' /etc/passwd |
匹配以 "root" 开头的行 |
| 匹配行的结尾 | egrep 'bash$' /etc/passwd |
匹配以 "bash" 结尾的行 | |
| 匹配除换行符外的任意单个字符 | egrep 'c.t' file.txt |
匹配 "cat"、"cut"、"c*t" 等 | |
[ ] |
匹配指定范围内的任意字符 | egrep '[0-9]' file.txt |
匹配包含数字的行 |
| 匹配前一个字符或子表达式 0 次或多次 | egrep '0*1' file.txt |
匹配 "1"、"01"、"001" 等 |
egrep 命令的常用选项
egrep 提供了丰富的选项,以增强搜索的灵活性和输出结果的可读性,以下是常用选项及其功能:
| 选项 | 全称 | 功能描述 |
|---|---|---|
-i |
--ignore-case |
忽略大小写进行匹配 |
-v |
--invert-match |
反向匹配,即输出不包含模式的行 |
-n |
--line-number |
显示匹配行的行号 |
-c |
--count |
仅输出匹配行的数量,而非具体内容 |
-l |
--files-with-matches |
仅输出包含匹配模式的文件名 |
-h |
--no-filename |
多文件搜索时,不显示文件名前缀 |
-o |
--only-matching |
仅显示匹配到的文本部分,而非整行 |
-w |
--word-regexp |
匹配完整的单词,而非子串 |
-r / -R |
--recursive |
递归搜索目录下的所有文件 |
-A |
--after-context=NUM |
显示匹配行后 NUM 行的内容 |
-B |
--before-context=NUM |
显示匹配行前 NUM 行的内容 |
-C |
--context=NUM |
显示匹配行前后各 NUM 行的内容 |
egrep 的实际应用场景
过滤日志文件中的错误信息
在服务器运维中,经常需要从日志文件中提取错误信息,从 Nginx 访问日志中查找状态码为 500 的行:

egrep 'HTTP/1\.1" 500' /var/log/nginx/access.log
若需同时显示错误行前后的 5 行上下文:
egrep -C 5 'HTTP/1\.1" 500' /var/log/nginx/access.log
统计文件中特定模式的数量
统计当前目录下所有 .log 文件中包含 "error" 的行数:
egrep -c 'error' *.log
提取 IP 地址
从文本文件中提取所有 IPv4 地址:
egrep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
-o 仅显示匹配部分,-E 显式启用扩展正则表达式(egrep 默认支持)。

匹配多个关键词
查找包含 "apple" 或 "orange" 或 "banana" 的行:
egrep 'apple|orange|banana' fruit_list.txt
递归搜索目录
递归搜索 /var/log 目录下所有包含 "failed" 的文件,并显示文件名:
egrep -l 'failed' /var/log/*
注意事项
- 元字符转义:若模式中包含正则表达式的特殊字符(如 、、),需使用反斜杠
\进行转义,例如匹配168.1.1时需写成192\.168\.1\.1。 - 性能优化:对于大文件,避免使用过于复杂的正则表达式(如嵌套量词),可能导致性能下降。
- 与 fgrep 的区别:fgrep(
grep -F)不支持正则表达式,直接按字符串匹配,适用于简单搜索场景。
相关问答 FAQs
问题 1:egrep 和 grep -E 有什么区别?
解答:egrep 是 grep -E 的别名,两者功能完全相同,egrep 是早期 Unix 系统中为支持扩展正则表达式而提供的独立命令,而现代 Linux 系统中推荐直接使用 grep -E,以统一命令风格。egrep 'pattern' file 和 grep -E 'pattern' file 的输出结果完全一致。
问题 2:如何使用 egrep 同时匹配多个关键词并显示行号?
解答:使用 -n 选项显示行号,用 连接多个关键词,在文件 test.txt 中匹配 "error" 或 "warning" 并显示行号:
egrep -n 'error|warning' test.txt
输出结果会显示匹配行的行号及内容,
5:2023-10-01 10:00:00 [ERROR] Disk space full
10:2023-10-01 10:05:00 [WARNING] High memory usage 