Busyboxでdmesgのtimestampを変換する
サーバ
Published: 2023-02-24

Busyboxのdmesgコマンドは、タイムスタンプを変換して表示する -T オプションがないので、ワンライナーで変換してみました。

ワンライナー

uptime=$(cut -d. -f1 /proc/uptime); dmesg | while read line; do time=$(echo $line | sed -e 's/^\[ *\([0-9]*\).*$/\1/g');  echo "[$(date -d @$(($(date +%s) - $uptime + $time)))] $(echo $line | cut -d ] -f 2 -)" ; done

ざっくり説明

  1. /proc/uptime にはシステムが起動してからの経過時間が秒単位で記録されています。
  2. dmesg で出力されるタイムスタンプは、システムが起動してからの経過時間です。
  3. 現在の時刻からシステムが起動してからの経過時間を引くと、システムが起動した時刻が求まります。
現在の時刻 - (累計稼働秒 - dmesgのタイムスタンプ) = ログの時刻