Tweak script perl para saída dmesg legível por humanos

2

No RHEL 6, eu tenho o parâmetro do kernel:

printk.time=1

Para que meu dmesg tenha um timestamp. No entanto, mostra em segundos a partir do reinício, assim:

[12.23456]

Encontrei um script que você coloca dentro do .bashrc que converte os segundos para a data do RH.

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

Isso funciona muito bem e minha saída do dmesg agora se parece com isso:

[Fri Jun 10 13:07:14 2016]

Mas como posso alterar o código para que fique assim:

[2016/06/10 13:25:28]
    
por user53029 10.06.2016 / 20:26

1 resposta

5

O % móduloPOSIX inclui a função strftime , que permite que os caracteres do especificador de conversão strftime(3) viam o modelo de tempo desejado:

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

Portanto, no seu caso, faça perl -MPOSIX=strftime -e ... e, em seguida,

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

Você pode precisar do modelo %Y-%m-%d %H... mais detalhado se seu strftime(3) não tiver %F , consulte strftime(3) para obter detalhes.

    
por 10.06.2016 / 21:15