引言:
你是否还在对着成堆的日志文件(Log)发愁?
是否还在用肉眼一行行扫描错误信息?
是否觉得 grep只能用来做个简单搜索?
今天,我们就来聊聊 Linux 中最强大、但也最容易让人“迷路”的命令家族——文本处理三剑客之一:grep。
掌握下面这几个技巧,让你在海量文本中精准狙击目标信息,效率提升 10 倍!
一、 基础篇:你真的会用 grep 吗?
很多人只知道 grep "error" app.log,其实加上几个参数,体验完全不同。
1️⃣ 忽略大小写:-i
日志里的错误千奇百怪:Error、ERROR、error。一个个试太麻烦了。
grep -i "error" app.log
✅ 作用:忽略大小写差异,一网打尽所有变种。
2️⃣ 显示行号:-n
找到了错误,但不知道在哪一行?-n帮你定位。
grep -n "NullPointerException" app.log
输出示例:
105: Caused by: java.lang.NullPointerException
✅ 作用:直接告诉你错误出现在第几行,方便上下文查看。
3️⃣ 只显示文件名:-l
如果你要找的是“哪个文件”包含了某个关键词(比如想找出所有包含 “timeout” 的配置文件),-l是神器。
grep -l "timeout" *.conf
✅ 作用:只输出文件名,不输出具体匹配的行内容,结果干净利落。
📌 小测验:
grep -il "keyword" *.log是什么意思?
👉 答案:忽略大小写,在所有 .log文件中查找,并只显示包含该关键词的文件名。
二、 进阶篇:组合拳才是王道
4️⃣ 递归搜索:-r
想在一个目录下所有子目录的所有文件里找东西?
grep -rn "database connection failed" /var/log/
✅ 作用:递归搜索目录,-r+ -n是排查线上问题的黄金搭档。
5️⃣ 反向查找:-v
有时候我们关心的是“没有成功”的请求。
grep -v "200 OK" access.log
✅ 作用:排除所有包含 “200 OK” 的行,剩下的全是异常或非成功请求。
6️⃣ 统计次数:-c
想知道某个错误出现了多少次?
grep -c "404 Not Found" access.log
✅ 作用:输出匹配的行数(Count),快速了解问题规模。
三、 高手篇:精准匹配与上下文
7️⃣ 全词匹配:-w
如果你搜 error,结果把 error_message、errors都带出来了,怎么办?
grep -w "error" app.log
✅ 作用:只匹配完整的单词,避免“误伤”。
8️⃣ 查看匹配行的上下文:-C / -B / -A
这是排查问题的必杀技!很多时候光看报错那一行不够,需要看前后几行。
# 显示匹配行及其前后各 5 行grep -C 5 "OutOfMemoryError" app.log# 只看匹配行的前 3 行 (-Before)grep -B 3 "shutdown" app.log# 只看匹配行的后 3 行 (-After)grep -A 3 "startup completed" app.log
✅ 作用:还原事故现场,看清错误发生前的堆栈或日志流。
四、 实战场景演练
🎯 场景一:紧急排查服务器 500 错误
# 在 nginx 日志中,找出所有 500 错误,并显示行号grep -rn " 500 " /usr/local/nginx/logs/access.log
🎯 场景二:清理临时文件
# 找出所有包含 'tmp' 但不是 '.tmp' 后缀的文件(排除法)ls | grep "tmp" | grep -v "\.tmp$"
🎯 场景三:代码审计
# 在整个项目中查找使用了 'System.out.println' 的 Java 文件grep -rl "System.out.println" src/
五、 总结:一张表记住所有参数
参数 | 全称 | 作用 |
|---|
-i
| ignore case | 忽略大小写 |
-n
| number | 显示行号 |
-l
| list files | 只显示文件名 |
-r
| recursive | 递归搜索 |
-v
| invert | 反向选择(不包含) |
-c
| count | 统计行数 |
-w
| word | 全词匹配 |
-C
| context | 显示上下文 |
写在最后:
grep的强大之处在于参数的自由组合。
熟练之后,你可以像搭积木一样,用一行命令完成复杂的过滤逻辑。
💡 今日作业:
在你的服务器上,试着用 grep -rn "关键字" .搜索一个目录,感受一下效率的提升!