Se você sabe em qual campo o timestamp está, por exemplo, a segunda palavra, você pode usar o awk para fazer a conversão fazendo com que ele chame date
:
stdbuf -oL tail -f ... |
awk -v timefield=2 '{
if($timefield ~ /[0-9].*Z/){
"date --date \"" $timefield "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
Você pode precisar obter o tail para não armazenar em buffer no pipe, conforme mostrado acima com stdbuf -oL
.
Se você não conhece o campo ou se ele se move, pode tentar corresponder ao padrão de fuso horário em cada palavra:
awk '{
for(timefield = 1;timefield<=NF;timefield++)
if($timefield ~ /^[0-9].*T.*Z$/){
"date --date \"" $timefield "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
Isso pressupõe que seu timestamp seja separado por espaço em branco.
Usando seu exemplo nos comentários de I2016-04-08T00:34:29.372Z]v3087
, você pode extrair o registro de data e hora usando o substr(string,offset,length)
do awk, pois ele tem comprimento e deslocamento constantes: datestamp = substr($timefield, 2, 24)
. Se você não quiser preservar o I
inicial e o código à direita na saída resultante, você acabará com:
awk -v timefield=1 '{
if($timefield ~ /[0-9].*Z/){
datestamp = substr($timefield, 2, 24)
"date --date \"" datestamp "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
Se você quiser manter o código extra, altere o sub
para substituir a sequência de registro de data e data em vez do campo inteiro, por exemplo, com espaços extras: sub(datestamp," " tod " ",$0)
.