Linux 文本三剑客实战:grep、sed、awk 一套组合拳搞定日志分析

举报
yd_227985793 发表于 2026/11/02 10:13:32 2026/11/02
【摘要】 在服务器上排障,一半时间在看日志。而日志分析的本质就是三件事:找到(grep)、改写(sed)、按列加工(awk)。这三个工具几乎所有 Linux 发行版都自带,不装任何东西就能开工,是比任何日志平台都更"轻"的装备。 一、grep:把要找的行捞出来假设有一份 Nginx 访问日志 access.log,每行长这样:192.168.1.10 - - [02/Nov/2026:09:15:01...

在服务器上排障,一半时间在看日志。而日志分析的本质就是三件事:找到(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 这类重装备,三剑客加一条管道就够了。先把上面这十来个参数用熟,再上更重的工具也不迟——毕竟工具越轻,思路越清楚。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。