Files
Knowledge/1 使用/Linux/grep.md
T

7.5 KiB
Raw Blame History

别再无脑敲 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

写留言

  • 亮

    北京23小时前

    赞

    grep -Rni

已无更多数据

运维漫谈

关注

76

295

58

1

复制搜一搜

复制搜一搜

暂无评论