Como posso usar o Awk para converter um carimbo de data / hora unix em legível para humanos ao fazer um arquivo de log Tail -f?

2

Atualmente estou fazendo um tail -f mysql.log e também tenho codificados por cores . Mas como eu usaria o awk para converter os timestamps unix em formato legível por humanos?

tail -f /var/lib/mysql/mysql-slow.log | awk '/User@Host:/ { $0 = "3[32m" $0 "3[39m" } /Query_time:/ { $0 = "3[36m" $0 "3[39m" } 1'

    
por Patoshi パトシ 18.05.2016 / 22:13

2 respostas

1

Se você tem o GNU awk ( gawk ), que normalmente é o caso de Linux e Cygwin não embutidos, então você pode usar o strftime function.

if (match($0, /^(.*timestamp=)([0-9]+)(.*)$/, parts)) {
    time = strftime("%F %T", parts[2]);
    $0 = parts[1] time parts[3];
}

Em um sistema embarcado com BusyBox, você pode ter uma versão mais restrita do awk, mas um utilitário date capaz de fazer a conversão.

if (match($0, /timestamp=[0-9]+/)) {
    system("date +'%F %T' -d " substr($0, RSTART+10, RLENGTH-10)) | getline time;
    $0 = substr($0, 1, RSTART) time substr($0, RSTART+RLENGTH);
}

Com apenas as ferramentas POSIX, não é possível converter entre datas legíveis por humanos e timestamps do Unix além de fazer o cálculo sozinho. (Eu sei que há código shell e awk disponível na web para isso, mas eu não tenho um link à mão.) Eu recomendo ter certeza de que você tem algo melhor instalado, como gawk, perl, python, etc.

    
por 19.05.2016 / 00:58
0

Descartar cores - você pode usar:

# | piped at the end 
awk -F'SET timestamp=' 'NF > 1{ system("date -d @" $2) }'

Remover as cores em linha com a redefinição torna isso mais desafiador; Eu suspeito que você pode controlar / ajustar isso removendo as sequências de escape incluídas que estão relacionadas à porção timestamp .

    
por 18.05.2016 / 22:29