为人类可读的 dmesg 输出调整 perl 脚本

use*_*029 2 perl text-processing timestamps dmesg

在 RHEL 6 中,我有内核参数:

printk.time=1
Run Code Online (Sandbox Code Playgroud)

这样我的 dmesg 就会有一个时间戳。但是它在重新启动后的几秒钟内显示,如下所示:

[12.23456]
Run Code Online (Sandbox Code Playgroud)

我找到了一个脚本,您将其放置在 .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
Run Code Online (Sandbox Code Playgroud)

这很好用,我的 dmesg 输出现在看起来像这样:

[Fri Jun 10 13:07:14 2016]
Run Code Online (Sandbox Code Playgroud)

但是我如何更改代码以使其看起来像这样:

[2016/06/10 13:25:28]
Run Code Online (Sandbox Code Playgroud)

thr*_*rig 5

POSIX模块包括以下strftime功能,该功能允许通过strftime(3)转换说明符字符获得所需的时间模板:

% perl -MPOSIX=strftime -E 'say strftime "[%F %T]", localtime(time)'
[2011-02-17 10:55:37]
%
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下perl -MPOSIX=strftime -e ...,然后

printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", strftime("%F %T", localtime(time - $uptime + $1)), $2 ) : $line )
Run Code Online (Sandbox Code Playgroud)

%Y-%m-%d %H...如果您strftime(3)缺少%F,您可能需要更详细的模板,strftime(3)有关详细信息,请参阅。