Linux grep 命令:文本搜索与日志分析实战指南
grep (Global Regular Expression Print) 是 Linux 三剑客(grep、awk、sed)之一,诞生于 1974 年,名字源于 ed 编辑器的 g/re/p 命令。它几乎出现在每一个 Linux 脚本和运维命令中,是文本处理流水线里不可或缺的一环。无论是排查日志、审计配置,还是在代码库中定位函数调用,grep 都能以极低的成本完成任务。
最基础的用法
grep "pattern" file.txt
在 file.txt 中搜索包含 pattern 的行,匹配的行会被输出到终端。如果省略文件名,grep 会从标准输入读取,因此可以配合管道使用:
cat file.txt | grep "pattern"
实际使用中,高频场景与命令组合
1. 忽略大小写
grep -i "error" /var/log/syslog
-i (ignore-case) 同时匹配 Error、ERROR、error 等变体,日志排查时几乎必用。
2. 显示行号
grep -n "TODO" ./src/main.py
-n (line-number) 在每行前面标注行号,方便快速定位到源文件中的具体位置。
3. 递归搜索目录
grep -rn "database_url" ./config/
-r (recursive) 递归搜索目录下所有文件,-n 同时显示行号。这是代码搜索的常用组合。
4. 只输出匹配的文件名
grep -rl "import os" ./src/
-l (files-with-matches) 只列出包含匹配内容的文件名,不显示具体行。适合"哪些文件用到了某个模块"这类问题。
5. 反向匹配(排除)
grep -v "^#" /etc/nginx/nginx.conf
-v (invert-match) 输出不匹配的行。配合 ^# 可以过滤掉配置文件中的注释行,只看有效配置。
6. 提取上下文
grep -C 3 "Exception" app.log # 匹配行前后各 3 行
grep -B 5 "panic" app.log # 匹配行前面 5 行
grep -A 10 "error" app.log # 匹配行后面 10 行
-C (context)、-B (before)、-A (after) 在排查日志时非常有用——错误本身往往只有一行,但根因藏在上下文里。
7. 精确单词匹配
grep -w "user" /etc/passwd
-w (word-regexp) 只匹配完整的单词,避免 user 匹配到 username、superuser 等。
8. 统计匹配行数
grep -c "404" /var/log/nginx/access.log
-c (count) 输出匹配的行数,快速统计某个错误出现的次数。
9. 使用正则表达式
# 基本正则
grep "^[0-9]\{3\}\.[0-9]\{3\}" file.txt
# 扩展正则(推荐)
grep -E "^[0-9]{3}\.[0-9]{3}" file.txt
# Perl 兼容正则(功能最强)
grep -P "\d{3}\.\d{3}" file.txt
-E 启用扩展正则,语法更简洁;-P 启用 Perl 兼容正则,支持 \d、\s、前瞻后顾等高级特性。
10. 多关键词搜索
grep -E "error|warning|critical" /var/log/syslog
用 | 分隔多个关键词,匹配任意一个即输出。等价于:
grep -e "error" -e "warning" -e "critical" /var/log/syslog
11. 配合管道过滤命令输出
ps aux | grep nginx
df -h | grep "/dev/sda"
journalctl -u nginx | grep "failed"
这是 grep 最经典的用法——从大量输出中筛选出关心的行。
12. 高亮匹配内容
grep --color=auto "error" /var/log/syslog
大多数发行版默认已开启颜色高亮。如果没生效,可以手动指定 --color=auto。
如果不知道如何下手,可以先尝试
grep -rn "error" /var/log/ --include="*.log" | head -20
这条命令递归搜索 /var/log/ 下所有 .log 文件中的 error,显示行号,并限制输出前 20 行。这是快速了解"日志里有什么错误"的快捷方式。
或者,当你在代码中查找某个函数的所有调用位置时:
grep -rn "def process_data" ./src/ # 找定义
grep -rn "process_data(" ./src/ # 找调用
性能优化技巧
- 大文件搜索用
grep -F:如果搜索的是固定字符串而非正则,-F(fixed-strings) 会关闭正则引擎,速度显著提升。 - 限制搜索文件类型:
grep -rn --include="*.py" "pattern" ./避免扫描无关文件。 - 排除目录:
grep -rn --exclude-dir=node_modules "pattern" ./跳过大型依赖目录。 - 并行搜索大目录:
rg(ripgrep) 是 grep 的现代替代品,默认并行搜索且智能忽略.gitignore文件,在代码库中搜索时体验更好。
grep 与相关工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
grep |
通用、预装、兼容性好 | 日常脚本、日志过滤 |
egrep |
等价于 grep -E |
需要扩展正则时 |
fgrep |
等价于 grep -F |
纯文本搜索,追求速度 |
rg (ripgrep) |
并行搜索、智能忽略 | 代码库搜索 |
ag (the silver searcher) |
类似 rg,更早出现 | 代码库搜索 |
- 点赞
- 收藏
- 关注作者
评论(0)