脚本中Dmesg日志查看如何过滤

wen 实用脚本 8

本文目录导读:

脚本中Dmesg日志查看如何过滤

  1. 基础过滤 - grep
  2. 按级别过滤
  3. 按时间/序号过滤
  4. 按设备/驱动过滤
  5. 脚本中的实用写法
  6. 高级过滤技巧
  7. 监控新日志(类似 tail -f)
  8. 常用过滤组合示例

在脚本中过滤 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)

抱歉,评论功能暂时关闭!