查日志再也不用翻到眼瞎
上一期讲了 Vim,有人说"我连退出都不会"(别慌,:wq 救命)。
这一期聊聊另一个每天都在用、但很多人只会最基础用法的命令——grep。
一句话说白了:grep 就是"在一堆文字里帮你找你要的那行"。
查日志、筛配置、排查故障……运维的日常就是跟文本打交道。不会 grep,等于瞎子摸象。
1. 最基础:在文件里找关键词
grep "error" /var/log/syslog
在 syslog 里找包含 error 的每一行。简单粗暴。
2. 忽略大小写:-i
日志里的 Error、ERROR、error 都想捞出来?
grep -i "error" /var/log/syslog
-i = ignore case,大小写通吃。
3. 显示行号:-n
找到了错误,想知道是第几行?
grep -n "error" /var/log/syslog
输出会带行号,比如 1234:Jun 1 10:23:45 server kernel: error,前面那个 1234 就是行号。
4. 反向匹配:-v
想排除掉某些行?比如看日志但不想看到 INFO 级别的:
grep -v "INFO" /var/log/app.log
-v = invert,反着来。想排除多个关键词:
grep -v -e "INFO" -e "DEBUG" /var/log/app.log
5. 递归搜索整个目录:-r
想找某个配置在哪个文件里?
grep -r "max_connections" /etc/mysql/
-r = recursive,递归搜目录下所有文件。加 -l 只显示文件名:
grep -rl "max_connections" /etc/mysql/
6. 正则表达式:-E
想匹配更复杂的模式?比如找所有以数字开头的行:
grep -E "^[0-9]" /etc/passwd
-E = extended regex,支持扩展正则。常用场景:
# 找 IP 地址
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /var/log/auth.log
# 找 5xx 错误
grep -E " 5[0-9]{2} " /var/log/nginx/access.log7. 显示匹配的上下文:-A / -B / -C
光看一行不过瘾?想看前后几行的上下文?
# 显示匹配行 + 后面 5 行
grep -A 5 "Exception" /var/log/app.log
# 显示匹配行 + 前面 5 行
grep -B 5 "Exception" /var/log/app.log
# 显示匹配行 + 前后各 3 行
grep -C 3 "Exception" /var/log/app.log
排查报错时特别有用,能看到报错前发生了什么。
8. 统计匹配次数:-c
想知道某个错误出现了多少次?
grep -c "404" /var/log/nginx/access.log
输出一个数字,比如 237。比 grep ... | wc -l 更方便。
9. 管道组合:grep + 其他命令
grep 真正好用的地方在于它能跟其他命令串起来:
# 看进程
ps aux | grep nginx
# 看端口
ss -tlnp | grep 8080
# 看磁盘使用率超过 80% 的分区
df -h | grep -E "8[0-9]%|9[0-9]%|100%"
# 多级过滤:找非本地的失败登录
cat /var/log/auth.log | grep "Failed" | grep -v "127.0.0.1"
管道 | 把前一个命令的输出喂给 grep,用熟了你会发现,Linux 的命令都是这么一个个串起来的。
10. 实时监控:配合 tail -f
想实时看日志里有没有新的错误?
tail -f /var/log/nginx/error.log | grep --line-buffered "500"
--line-buffered 很重要,不然 grep 会缓冲输出,你看到的不是实时的。
速查表
| 场景 |
命令 |
| 找关键词 |
grep "keyword" file |
| 忽略大小写 |
grep -i "keyword" file |
| 显示行号 |
grep -n "keyword" file |
| 排除某行 |
grep -v "keyword" file |
| 递归搜索目录 |
grep -r "keyword" /path/ |
| 只显示文件名 |
grep -rl "keyword" /path/ |
| 正则匹配 |
grep -E "pattern" file |
| 看上下文 |
grep -C 3 "keyword" file |
| 统计次数 |
grep -c "keyword" file |
| 实时监控 |
tail -f file | grep --line-buffered "keyword" |
一句话总结
说真的,不会 grep 的运维,查日志只能靠肉眼翻;会了 grep,一行命令搞定。这玩意儿不难,但用熟了真的能省很多时间。
下期预告:awk —— 比 Excel 更好用的文本处理神器
—— 三页札记 ——
关注我,每周分享 Linux 运维实战技巧
