Linux 文本三剑客实战:grep、sed、awk 一套组合拳搞定日志分析
在服务器上排障,一半时间在看日志。而日志分析的本质就是三件事:找到(grep)、改写(sed)、按列加工(awk)。这三个工具几乎所有 Linux 发行版都自带,不装任何东西就能开工,是比任何日志平台都更"轻"的装备。
一、grep:把要找的行捞出来
假设有一份 Nginx 访问日志 access.log,每行长这样:
192.168.1.10 - - [02/Nov/2026:09:15:01 +0800] "GET /api/user HTTP/1.1" 200 512
常用姿势:
# 找出所有 500 报错的请求
grep ' 500 ' access.log
# 递归搜索整个目录,并显示行号
grep -rn 'timeout' /var/log/nginx/
# 不区分大小写,Error/error/ERROR 一网打尽
grep -i 'error' app.log
# 反向过滤:看所有非 200 的行
grep -v ' 200 ' access.log
# 扩展正则:匹配 4xx 或 5xx 状态码
grep -E ' (4|5)[0-9]{2} ' access.log
一个容易被忽略的参数是 -c:只输出匹配行的数量,做快速统计时比 grep xxx | wc -l 少起一个进程。
二、sed:按行改写,改完直接落盘
sed 是"流编辑器",最常见的用法是替换:
# 把日志里的内网 IP 打码
sed 's/192\.168\.[0-9.]\*/[内网]/g' access.log
# 只看第 10 到 20 行
sed -n '10,20p' access.log
# 删除空行和注释行,得到一份干净配置
sed -i '/^$/d; /^#/d' nginx.conf
-i 会直接改写原文件。第一次在服务器上用,建议先不带 -i 跑一遍确认输出;或者用 sed -i.bak,让它顺手留个 .bak 备份,改坏了还能救回来。
三、awk:按列加工,顺手完成统计
日志按空格分列,awk 天生擅长处理这种结构:
# 提取第 1 列(客户端 IP)
awk '{print $1}' access.log
# 只处理状态码为 500 的行,取出对应 IP
awk '$9 == 500 {print $1}' access.log
# 数组 + 循环:统计每个 IP 出现的次数
awk '{cnt[$1]++} END {for (ip in cnt) print ip, cnt[ip]}' access.log
$1、$9 是按分隔符切出来的第 n 列,条件写在花括号前面,动作写在里面,读起来几乎就是一句话。
四、组合拳:一条管道找出访问量 Top 10 的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
拆开看每一层:awk 取列 → sort 排序 → uniq -c 计数 → sort -rn 按次数倒序 → head 取前 10。每个环节只做一件小事,串起来就是一次完整分析。
再进一步,算一下 5xx 错误占比:
total=$(wc -l < access.log)
err=$(awk '$9 ~ /^5/' access.log | wc -l)
awk -v t="$total" -v e="$err" 'BEGIN {printf "%.2f%%\n", e/t*100}'
-v 把 shell 变量传进 awk,BEGIN 块保证不读文件、只做计算,输出一个干净的百分比。
结语
grep 负责"找到",sed 负责"改写",awk 负责"加工统计"。日常排障里 80% 的日志问题,其实用不着 ELK 这类重装备,三剑客加一条管道就够了。先把上面这十来个参数用熟,再上更重的工具也不迟——毕竟工具越轻,思路越清楚。
- 点赞
- 收藏
- 关注作者
评论(0)