在 RHEL 6 中我有内核参数:
printk.time=1
这样我的 dmesg 就会有时间戳。然而,它会在重新启动后几秒钟内显示,如下所示:
[12.23456]
我找到了一个放置在 .bashrc 中的脚本,该脚本将秒转换为 HR 日期。
dmesg_with_human_timestamps () {
$(type -P dmesg) "$@" | perl -w -e 'use strict;
my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./);
foreach my $line (<>) {
printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line )
}'
}
alias dmesg=dmesg_with_human_timestamps
这非常有效,我的 dmesg 输出现在如下所示:
[Fri Jun 10 13:07:14 2016]
但我怎样才能改变代码,使其看起来像这样:
[2016/06/10 13:25:28]
答案1
这POSIX
模块包括该strftime
函数,该函数允许通过strftime(3)
转换说明符字符获得所需的时间模板:
% perl -MPOSIX=strftime -E 'say strftime "[%F %T]", localtime(time)'
[2011-02-17 10:55:37]
%
所以就你的情况来说,perl -MPOSIX=strftime -e ...
然后
printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", strftime("%F %T", localtime(time - $uptime + $1)), $2 ) : $line )
%Y-%m-%d %H...
如果您strftime(3)
缺少%F
,您可能需要更详细的模板,请参阅strftime(3)
参考资料 。