用 grep、sed、awk 快速处理日志文本:三件套各司其职
【摘要】 日志文件动不动几十万行,靠眼睛翻不现实。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)