395 lines
7.5 KiB
Markdown
395 lines
7.5 KiB
Markdown
# 别再无脑敲 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
|
||
|
||
|
||
已无更多数据
|
||
|
||
[](javacript:;)
|
||
|
||

|
||
|
||
运维漫谈
|
||
|
||
关注
|
||
|
||
76
|
||
|
||
295
|
||
|
||
58
|
||
|
||
1
|
||
|
||

|
||
|
||
复制搜一搜
|
||
|
||
复制搜一搜
|
||
|
||
暂无评论 |