Acho que o que você está procurando é -T
, conforme documentado em man dmesg
:
-T, --ctime
Print human readable timestamps. The timestamp could be inaccurate!
The time source used for the logs is not updated after system SUSPEND/RESUME.
Então, por exemplo:
[ 518.511925] usb 2-1.1: new low-speed USB device number 7 using ehci-pci
[ 518.615735] usb 2-1.1: New USB device found, idVendor=1c4f, idProduct=0002
[ 518.615742] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 518.615747] usb 2-1.1: Product: USB Keykoard
Torna-se:
[Mon Jan 27 16:22:42 2014] hid-generic 0003:1C4F:0002.0007: input,hidraw0: USB HID v1.10 Keyboard [USB USB Keykoard] on usb-0000:00:1d.0-1.1/input0
[Mon Jan 27 16:22:42 2014] input: USB USB Keykoard as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.1/input/input24
[Mon Jan 27 16:22:42 2014] hid-generic 0003:1C4F:0002.0008: input,hidraw1: USB HID v1.10 Device [USB USB Keykoard] on usb-0000:00:1d.0-1.1/input1
Eu encontrei um truque legal aqui . A expressão sed
usada estava errada, pois falharia quando havia mais de um ]
na linha dmesg
. Eu o modifiquei para trabalhar com todos os casos que encontrei em minha própria saída dmesg
. Então, isso deve funcionar supondo que seu date
se comporta como esperado:
base=$(cut -d '.' -f1 /proc/uptime);
seconds=$(date +%s);
dmesg | sed 's/\]//;s/\[//;s/\([^.]\)\.\([^ ]*\)\(.*\)/\n/' |
while read first; do
read second;
first='date +"%d/%m/%Y %H:%M:%S" --date="@$(($seconds - $base + $first))"';
printf "[%s] %s\n" "$first" "$second";
done
A saída parece:
[27/01/2014 16:14:45] usb 2-1.1: new low-speed USB device number 7 using ehci-pci
[27/01/2014 16:14:45] usb 2-1.1: New USB device found, idVendor=1c4f, idProduct=0002
[27/01/2014 16:14:45] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[27/01/2014 16:14:45] usb 2-1.1: Product: USB Keykoard