web-dev-qa-db-ja.com

人間が読める形式のdmesg出力用にPerlスクリプトを微調整

RHEL 6には、カーネルパラメーターがあります。

printk.time=1

そのため、私のdmesgにはタイムスタンプがあります。ただし、次のように、再起動から数秒で表示されます。

[12.23456]

秒をHR日付に変換する.bashrc内に配置するスクリプトを見つけました。

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]
2
user53029

POSIX module には、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 )
_

strftime(3)に_%Y-%m-%d %H..._がない場合は、より詳細な_%F_テンプレートが必要になる場合があります。詳細については、strftime(3)を参照してください。

5
thrig