dmesg 的输出里,每行开头是时间信息,通常是这样的:
1 2 3 |
[ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct |
中括号里的值就是时间,只不过是以本次引导为基准的流逝。
有无办法将其显示为一目了然的时间呢?首先尝试了一下 Linux 下的人性化参数 -h
不对,顺便看了下帮助竟然是需要 -H
。加上以后输出变成了这样:
1 2 3 |
[Nov16 11:45] Initializing cgroup subsys cpuset [ +0.000000] Initializing cgroup subsys cpu [ +0.000000] Initializing cgroup subsys cpuacct |
隔一阵只能显示一个基准时间,之后显示为流逝偏移。要不手动加工下?按行就地编辑,sed
是第一联想物,先得把中括号里的内容匹配出来吧?嗯,假设要替换成一个固定字符串的话,应该是这样:dmesg | sed "s/^\[[0-9.]*\]/dandy/g"
。然而我们的期望并非如此简单,要处理的点至少有:1. 获取到系统本次引导的基准时间;2. 把匹配到的内容与之运算;3. 将运算结果回填/输出。搜索发现,awk
是可行的,且有前人成果:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/sh uptime_ts=`cat /proc/uptime | awk '{ print $1}'` # echo $uptime_ts dmesg | awk -v uptime_ts=$uptime_ts 'BEGIN { now_ts = systime(); start_ts = now_ts - uptime_ts; # print "system start time seconds: ", start_ts; # print "system start time: ", strftime("[%Y/%m/%d %H:%M:%S]", start_ts); } { print strftime("[%Y/%m/%d %H:%M:%S]", start_ts + substr($1, 2, length($1) - 2)), $0 }' |
最后。其实呢,dmesg
命令有个 -T
参数,可以直接输出可读的日期和时间。