7.5 KiB
别再无脑敲 grep 了,我靠这 5 个选项,定位问题速度提升 10 倍
在日常运维工作中,我们几乎每天都在和日志、配置文件、代码片段打交道。
日志动辄几十 GB,配置文件成百上千行,出问题时,时间永远是最宝贵的资源。
很多同事都会用 grep,但90% 的人只会用最基础的 grep "keyword" file。 结果就是:
-
要么匹配不准
-
要么结果一大堆
-
要么漏掉关键信息
今天这篇文章,我不讲 grep 的所有参数,而是分享我在一线运维工作中,真正高频使用、最有价值的 5 个 grep 选项。
只要你把这 5 个选项用熟,你几乎可以在任何复杂场景下,快速定位你想要的内容。
在进入正题之前,先统一一个认知。
grep 是什么?
grep = Global Regular Expression Print
但在运维眼里,它的真实含义是:
-
日志分析利器
-
故障定位放大镜
-
海量文本的“手术刀”
无论你是:
-
查 Nginx / Tomcat / MySQL 日志
-
翻 Kubernetes 容器日志
-
排查线上报错
-
审计配置变更
-
甚至简单查代码
grep 几乎是第一反应。
我最常用的 5 个 grep 选项总览
先给大家一个总览,后面逐个展开。
| 选项 | 作用 | 使用频率 |
|---|---|---|
-n |
显示行号 | ⭐⭐⭐⭐⭐ |
-i |
忽略大小写 | ⭐⭐⭐⭐ |
-v |
反向匹配 | ⭐⭐⭐⭐⭐ |
-C / -A / -B |
上下文查看 | ⭐⭐⭐⭐ |
-E |
扩展正则 | ⭐⭐⭐⭐⭐ |
这 5 个选项,几乎覆盖了我 80% 的 grep 使用场景。
行号
1️⃣ 基本用法
grep -n "error" application.log
输出类似:
2451:2024-06-01 10:23:11 ERROR Connection timeout
2️⃣ 为什么我几乎永远带 -n
原因很简单:行号 = 定位能力。
-
你要和同事对齐信息
-
你要回到文件中继续分析
-
你要用 sed / vim / awk 二次处理
没有行号,等于失去坐标。
3️⃣ 实战场景
-
让开发快速定位代码或日志位置
-
在 vim 里
:2451直接跳转 -
用 sed 精确截取问题区间
只要 grep 文件,我几乎条件反射就加 -n
-i:别让大小写浪费你的时间
1️⃣ 基本用法
grep -i "error" app.log
等价于:
-
error
-
Error
-
ERROR
-
eRrOr
2️⃣ 真实痛点
你一定遇到过这种情况:
grep "error" app.log# 什么都没匹配到
结果一看日志,全是:
ERROR
3️⃣ 运维经验
-
日志格式不统一
-
不同组件输出风格不同
-
第三方程序你根本控制不了
与其记大小写,不如让 grep 忽略它。
4️⃣ 建议
查日志时,只要关键词是英文,我几乎都会加 -i
-v:排除干扰信息,快速聚焦重点
1️⃣ -v 是什么
grep -v "info" app.log
含义是:显示不包含 info 的行
2️⃣ 为什么 -v 在运维中非常重要
日志里最常见的是什么?
-
INFO
-
DEBUG
-
心跳日志
-
健康检查
但我们真正关心的,往往只有:
-
ERROR
-
WARN
-
Exception
3️⃣ 经典组合用法
grep -i "error" app.log | grep -v "timeout"
含义是:
查 error,但排除已知的、无关的 timeout 错误
4️⃣ 实战案例
排查线上告警:
grep -i "error" app.log | grep -v "connection reset"
瞬间把 90% 的“噪音”过滤掉。
-v 是 grep 的“降噪耳机”
-C / -A / -B:只看一行,等于没看日志
1️⃣ 为什么只看一行日志是不够的
一条 ERROR 往往是这样的:
-
前几行:请求参数
-
当前行:错误提示
-
后几行:堆栈信息
如果你只看命中那一行,信息是不完整的。
2️⃣ 常用参数说明
-
-A n:显示匹配行 后 n 行 -
-B n:显示匹配行 前 n 行 -
-C n:显示前后各 n 行
3️⃣ 实战示例
grep -n -C 5 "NullPointerException" app.log
输出的不是一行,而是一个完整上下文块。
4️⃣ 典型使用场景
-
Java 堆栈分析
-
请求链路排查
-
分析程序执行路径
grep + 上下文,才是真正的“读日志”
-E:让 grep 真正“强大”的关键
1️⃣ 什么是 -E
-E 启用 扩展正则表达式,让 grep 支持:
-
|(或) -
+ -
? -
()分组
2️⃣ 没有 -E 的痛苦
grep "error|warn" app.log# 匹配不到
3️⃣ 正确用法
grep -E "error|warn|exception" app.log
4️⃣ 高频实战场景
一次查多种关键字:
grep -Ei "error|fail|timeout" app.log
匹配 IP:
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
只要涉及“多条件匹配”,我直接上 -E
我最常用的 grep 组合拳
最后分享几个我在生产环境里天天用的组合命令。
1️⃣ 查错误并带上下文
grep -in -C 5 "error" app.log
2️⃣ 查错误,排除已知无关问题
grep -Ei "error|exception" app.log | grep -v "timeout"
3️⃣ 查最近错误(配合 tail)
tail -n 1000 app.log | grep -i "error"
大事!运维漫谈-技术交流群对外开放!
扫码可添加小编微信,申请进****群
▲长按加群
运维漫谈
运维漫谈,漫谈整个网络安全、云计算、大数据、数据库、开发等运维技术干货,旨在分享干货,帮您更快学习相关知识,解决问题,同时还有福利活动哦,关注我,带你成为大神,遨游技术海洋!
922篇原创内容
公众号
Linux · 目录
上一篇这6个工具,让你的Linux监控如鱼得水,运维效率翻倍!下一篇如何查看 Ubuntu 服务器到底什么时候重启的?
阅读 3351
grep上下文参数
留言 1
写留言
已无更多数据
运维漫谈
关注
76
295
58
1
复制搜一搜
复制搜一搜
暂无评论