如何按时间过滤 dmesg

如何按时间过滤 dmesg

我想按时间过滤。例如:
dmesg -sec 30
输出是过去 30 秒内发生的事件。或者按时间间隔。任何按时间过滤。

答案1

编写一个脚本,将当前时间添加到 dmegs 条目中的时间戳,然后将该时间与当前时间进行比较,并显示比所需间隔更新的行。

以下是一个例子:

#!/bin/bash

if [ $# -eq 0 ]
  then
    echo "Argument Error.  Please specify the Time interval in seconds."
    exit
fi

timeinterval=$1 # change this to the desired time interval
currenttime=$(date +%s)

string="$(who -b | awk '{print $3"-"$4}')"

IFS='-' read -a array <<< "$string"

MONTHS=(X Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

year="${array[0]}"
month=${MONTHS[${array[1]}]}
day="${array[2]}"
hour="${array[3]}"

daystring="$month $day $year $hour"

bootime=$(date --date="$daystring" +%s)

dmesg | while read line; do 
    dmesgstamp=$(echo "$line" | awk -F'[' '{print $2}' | awk -F\. '{print $1}')
    dmesgstamp=$((dmesgstamp += bootime))
    results=$((currenttime-dmesgstamp))
    if ((results < timeinterval)); then
        echo "$line"
    fi
done

以秒为间隔作为参数运行脚本:

$ ./script.sh 30

答案2

您应该能够使用以下命令完成此操作:

journalctl -kS -25min

-k 仅用于内核消息,-S 用于定义时间。

对于相反的方向,更详细的输出限制为 1000 行,也许可以尝试:-kexS -25min

还检查man systemd.time

答案3

请注意,如果 LC_LOCALE=POSIX,则必须修改 LD James 的答案,因为缺少“年份”会导致错误:

linuxmaster:~ # who -b
         system boot  Oct 11 13:44

更好(在我的例子中,德语 LC_LOCALE 有效):

string="$(LC_TIME="de_DE.UTF-8" who -b | awk '{print $3"-"$4}')"

相关内容