用 grep、sed、awk 快速处理日志文本:三件套各司其职

举报
yd_236639601 发表于 2026/11/04 12:01:45 2026/11/04
【摘要】 日志文件动不动几十万行,靠眼睛翻不现实。grep 负责找、sed 负责改、awk 负责算,三条命令组合起来,日志分析的大部分活都不用写脚本。 一、grep:先把相关的行捞出来grep "ERROR" app.log | head -n 50grep -c "timeout" app.loggrep -v "healthcheck" app.log | grep "500"grep 只干一件事...

日志文件动不动几十万行,靠眼睛翻不现实。grep 负责找、sed 负责改、awk 负责算,三条命令组合起来,日志分析的大部分活都不用写脚本。

一、grep:先把相关的行捞出来

grep "ERROR" app.log | head -n 50
grep -c "timeout" app.log
grep -v "healthcheck" app.log | grep "500"

grep 只干一件事:按模式过滤行。-c 直接数出现次数,-v 反选排除干扰行(比如健康检查日志)。先过滤再分析,别对着全量日志动手。

时间段过滤用 grep 也够用,前提是日志带时间戳:

grep "2026-11-04 09:" app.log | grep "ERROR"

先按时间收窄、再按级别收窄,两层过滤后剩下的基本就是故障现场。

二、sed:批量替换与提取,一行搞定

sed -n '100,200p' app.log
sed 's/192\.168\.1\.[0-9]*/IP已脱敏/g' app.log | head

sed -n 'a,bp' 只打印指定行号区间,定位到某段日志先看原文。s/旧/新/g 做批量替换,分享日志前把内网 IP、Token 脱敏就靠它,记得转义点号。

只想看某一类行的关键部分时,用 sed 截掉前缀:

sed 's/^.*ERROR //' app.log | head -n 20

把时间戳、服务名前缀一次性砍掉,剩下的就是报错原文,对比起来快得多。

三、awk:按列统计,算出 Top N

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
awk '$9 == 500 {print $7}' access.log | sort | uniq -c | sort -nr | head

日志大多是按列排的,awk 按列取数最方便:第一条统计访问量最大的 IP,第二条统计返回 500 最多的接口路径。sort | uniq -c | sort -nr 是固定套路,算 Top N 不用背。

按时间段统计错误数时,awk 的条件过滤比 grep 更灵活:

awk '$2 >= "09:00" && $2 < "10:00" && /ERROR/ {count++} END {print count}' app.log

小结

grep 找行、sed 改行、awk 算列,三件套的组合拳是:grep 收窄范围 → sed 清洗脱敏 → awk 按列统计。日志分析先过滤再统计,别一上来就写 Python 脚本,大多数问题三条命令就够了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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