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) .