本文目录导读:

在脚本中过滤 dmesg 日志,常用方法如下:
基础过滤 - grep
# 过滤包含特定关键词 dmesg | grep "error" dmesg | grep -i "usb" # 忽略大小写 # 组合过滤 dmesg | grep -E "error|fail|warn"
按级别过滤
# 按日志级别过滤 (0-7) dmesg -l err # 只显示错误 dmesg -l warn # 只显示警告 dmesg -l info # 只显示信息 # 组合级别 dmesg -l err,warn,crit
级别说明:
emerg(0) - 紧急alert(1) - 警报crit(2) - 严重err(3) - 错误warn(4) - 警告notice(5) - 注意info(6) - 信息debug(7) - 调试
按时间/序号过滤
# 显示最新N条 dmesg | tail -n 20 # 按时间范围(需要先启用时间戳) dmesg -T | grep "Mar 15" # 过滤3月15日 # 从特定序号开始 dmesg | tail -n +1000 | head -20 # 从第1000条开始显示20条
按设备/驱动过滤
# 特定设备 dmesg | grep -i "sda\|sdb\|nvme" dmesg | grep -i "network\|eth\|wlan" # USB设备 dmesg | grep -i "usb" dmesg | grep -i "hid\|mouse\|keyboard"
脚本中的实用写法
#!/bin/bash
# 1. 实时监控新日志
dmesg --follow &
PID=$!
sleep 5
kill $PID
# 2. 检测特定错误后退出
while true; do
if dmesg | grep -q "Out of memory"; then
echo "检测到OOM错误" >&2
break
fi
sleep 2
done
# 3. 保存过滤结果到变量
errors=$(dmesg -l err | grep "critical")
if [ -n "$errors" ]; then
echo "发现严重错误:"
echo "$errors"
fi
# 4. 时间范围过滤 (示例:过去5分钟)
dmesg -T | awk -v d="$(date -d '-5 min' '+%b %e %H:%M')" '$0 >= d'
高级过滤技巧
# 正则匹配多关键词
dmesg | grep -P "(error|fail|critical|fatal)"
# 排除特定内容
dmesg | grep "error" | grep -v "soft" # 包含error但不包含soft
# 统计各类错误数量
dmesg -l err,warn | awk '{print $5}' | sort | uniq -c
# 使用jq处理(结构化输出)
dmesg --json | jq '.[] | select(.level == "err")'
监控新日志(类似 tail -f)
# 持续监控,显示新产生的日志
dmesg -w
# 在脚本中监控,处理新出现的错误
dmesg -w | while read line; do
if echo "$line" | grep -q "error\|critical"; then
echo "[ALERT] 检测到错误: $line"
# 执行告警操作
fi
done
常用过滤组合示例
# 检查磁盘错误 dmesg | grep -E "I/O error|buffer I/O|ata.*fail|DRDY|UNC" # 检查内存问题 dmesg | grep -E "Out of memory|OOM|memory corruption" # 检查网络问题 dmesg | grep -E "network|link down|carrier lost"
注意事项:
- 使用
-T参数将时间戳转为可读格式 - 日志可能被循环覆盖,
dmesg -c会清空日志 - 在脚本中注意权限(通常需要 root)