引言
grep 是 Linux 系统中最强大的文本搜索工具之一。它的名字来源于 Global Regular Expression Print(全局正则表达式打印),可以在文件中搜索匹配指定模式的行并输出。无论是日常开发、服务器运维还是日志分析,grep 都是不可或缺的利器。
本文将系统性地介绍 grep 的核心参数、正则表达式用法、实战案例以及高级技巧。
一、基本语法
最简单的用法是在单个文件中搜索关键词:
1
| grep "error" /var/log/nginx/access.log
|
二、核心参数详解
下面是 grep 最常用的参数速查表:
| 参数 | 长格式 | 说明 |
-i | --ignore-case | 忽略大小写 |
-v | --invert-match | 反向匹配,输出不包含模式的行 |
-n | --line-number | 显示匹配行的行号 |
-r | --recursive | 递归搜索子目录 |
-l | --files-with-matches | 只输出包含匹配的文件名 |
-c | --count | 输出每个文件的匹配行数 |
-w | --word-regexp | 按单词精确匹配 |
-E | --extended-regexp | 使用扩展正则表达式 |
-o | --only-matching | 只输出匹配的部分,而非整行 |
-A n | --after-context | 输出匹配行及后 n 行 |
-B n | --before-context | 输出匹配行及前 n 行 |
-C n | --context | 输出匹配行及前后各 n 行 |
常用参数示例
忽略大小写搜索:
1 2
| grep -i "warning" app.log
|
显示行号并递归搜索:
1 2
| grep -rn "TODO" /home/project/src/
|
反向匹配(排除干扰行):
1 2
| grep -v "^#" /etc/nginx/nginx.conf
|
输出上下文:
1 2
| grep -C 3 "FATAL ERROR" server.log
|
三、正则表达式实战
3.1 基本正则表达式(BRE)
默认情况下 grep 使用基本正则表达式,部分元字符需要转义:
1 2 3 4 5 6 7 8 9 10 11
| grep "^error" log.txt
grep "\.$" log.txt
grep "[0-9]" data.txt
grep "^$" file.txt
|
3.2 扩展正则表达式(ERE)
使用 -E 参数启用扩展正则表达式,无需转义 +、?、|、() 等元字符:
1 2 3 4 5 6 7 8
| grep -E "error|warning" log.txt
grep -E "[0-9]{3,}" log.txt
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
|
3.3 Perl 兼容正则表达式(PCRE)
使用 -P 参数启用 Perl 兼容正则,支持更高级的特性:
1 2 3 4 5 6 7 8 9
| grep -oP 'href="(.*?)"' index.html
echo "user@example.com" | grep -oP '\w+(?=@)'
grep -P '(?<!http)s://' urls.txt
|
四、实战案例
案例 1:分析 Nginx 访问日志
1 2 3 4 5 6 7 8
| grep -c ' 404 ' /var/log/nginx/access.log
grep -E 'HTTP/1\.[01]" 5[0-9]{2}' access.log | awk '{print $1}' | sort | uniq -c | sort -rn
grep "07/Jun/2026" access.log | grep -oP ':[0-9]{2}:[0-9]{2}:[0-9]{2}' | cut -d: -f1 | sort | uniq -c
|
案例 2:代码仓库批量搜索
1 2 3 4 5 6 7 8
| grep -rn "^def " --include="*.py" /home/project/
grep -rn "FIXME" --include="*.{js,py,java}" . | wc -l
grep -rn "apiKey" --exclude-dir=node_modules .
|
案例 3:系统诊断
1 2 3 4 5 6 7 8
| grep -v "^#" /etc/crontab | grep -v "^$"
df -h | grep -E "[8-9][0-9]%|100%"
ps aux | grep -E "[p]ython"
|
五、高效组合技巧
5.1 grep + find
1 2
| find /var/log -name "*.log" -mtime -7 -exec grep -l "ERROR" {} \;
|
5.2 grep + xargs
1 2 3 4 5
| grep -rl "password" /home/user/ | xargs rm -f
grep -rl "#!/bin/bash" /scripts/ | xargs chmod +x
|
5.3 多模式匹配
使用 -f 从文件中读取多个模式:
1 2 3 4 5 6 7 8 9
| cat > patterns.txt << EOF ^ERROR ^CRITICAL ^FATAL EOF
grep -f patterns.txt system.log
|
六、性能优化
处理大文件时,以下技巧可以显著提升速度:
| 技巧 |
命令 |
说明 |
| 使用 LC_ALL=C |
LC_ALL=C grep pattern bigfile |
禁用 locale 处理,提速 2-3 倍 |
| 固定字符串模式 |
grep -F "literal" file |
不使用正则,纯文本匹配 |
| 提前终止 |
grep -m 10 pattern file |
找到 10 个匹配后停止 |
| 并行处理 |
parallel grep pattern {} ::: *.log |
多 CPU 同时搜索 |
| 内存映射 |
grep --mmap pattern file |
使用内存映射(旧内核有效) |
大文件搜索示例
1 2 3 4 5
| time LC_ALL=C grep -F "OutOfMemoryError" huge.log
grep -n -m 5 "ERROR" huge.log
|
七、常见陷阱与注意事项
- 不要用
grep -r 搜索二进制文件 — 加 -I 参数忽略二进制文件,或使用 --binary-files=without-match
- 模式中有空格时务必加引号 —
grep "hello world" file 而不是 grep hello world file
-v 与 -c 组合时注意含义 — grep -vc pattern file 输出不匹配的行数
- 彩色输出默认可能被管道禁用 — 用
grep --color=always 强制保留颜色
八、快速参考:常用场景速查
| 需求场景 | 命令 |
| 递归搜索所有 .log 文件 | grep -rn --include="*.log" "pattern" |
| 统计重复次数 | grep -o "pattern" file \| sort \| uniq -c \| sort -rn |
| 搜索并替换 | grep -rl "old" . \| xargs sed -i 's/old/new/g' |
| 只显示文件名 | grep -rl "pattern" . |
| 区分大小写 | grep -i "pattern" file |
| 精确匹配单词 | grep -w "exact" file |
| 多文件统计 | grep -c "pattern" *.log |
| 跨行匹配 | grep -Pz 'line1\\n.*line2' file |
结语
grep 虽然只有四个字母,但其背后的正则表达式体系和丰富的参数选项让它成为 Linux 文本处理的瑞士军刀。掌握 grep 不仅能提高日常工作效率,更是深入使用 Linux 命令行的基本功。建议读者在终端中多动手练习,将本文中的示例逐一运行加深理解。
本文由AI辅助生成,内容仅供参考