日志分析应明确grep负责筛选、awk负责解析;grep可按错误级别快速定位问题行并统计次数,awk能提取服务名统计频次或按时间范围精确筛选。

日志分析用好 grep 和 awk,关键不是堆命令,而是分清分工:grep 负责“找出来”,awk 负责“拆开看”。系统日志(如 /var/log/syslog 或 /var/log/messages)通常格式松散、字段不固定,但时间、服务名、优先级、内容这几项基本稳定。下面直接说实用方法。
按错误级别快速抓出问题行
系统日志里最常关注的是 ERROR、CRITICAL、Failed 这类关键词。用 grep 快速过滤,加 -i 忽略大小写,-n 带行号便于回溯:
grep -in "error\|fail\|critical" /var/log/syslog- 想排除干扰项(比如健康检查),可叠加
-v:grep -i "error" /var/log/syslog | grep -v "health" - 统计错误总次数:
grep -ic "error" /var/log/syslog
提取并统计高频出错的服务或进程
系统日志每行开头通常是时间,第4–6列常见的是主机名、服务名(如 sshd、systemd)、进程ID或模块标识。用 awk 按空格切分后取关键列:
- 查出所有非空服务名并统计频次:
awk '{print $5}' /var/log/syslog | grep -v "^$" | sort | uniq -c | sort -nr(注意:列数需根据实际日志微调,可用head -1 /var/log/syslog先看结构) - 只看含
Failed且服务是sshd的记录:awk '$0 ~ /Failed/ && $5 == "sshd" {print $1,$2,$3,$5,$7}' /var/log/auth.log
按时间范围筛选故障时段
系统日志时间戳多为 Aug 12 14:23:05 格式(月 日 时:分:秒),不在行首也不带年份,直接用 grep 匹配容易误伤。更稳的方式是用 awk 精确匹配字段:
- 查今天下午 2 点到 3 点的全部日志:
awk '$1=="Aug" && $2==12 && $3>=14 && $3(假设当前是 8 月 12 日) - 查某分钟内所有错误:
awk '$1=="Aug" && $2==12 && $3=="14:30:" {print}' /var/log/syslog | grep -i error - 如果日志含完整 ISO 时间(如
2026-08-12T14:30:22),可用grep "^2026-08-12T14:30"直接前缀匹配
组合使用:先过滤再结构化输出
真实排查中,往往要“先缩小范围,再看清细节”。把 grep 和 awk 用管道串起来,效率翻倍:
- 找出所有 SSH 登录失败的 IP 并去重计数:
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr(第 11 列通常是 IP) - 查看最近 10 条 ERROR 行及其前后上下文:
grep -i "error" /var/log/syslog | tail -10 | awk '{print NR ": " $0}' - 提取错误行中的时间+服务+消息主体:
grep -i "error" /var/log/syslog | awk '{print $1,$2,$3,$5,$0}' | cut -d' ' -f1-5,7-











