Script para converter o horário da época em formato legível por humanos

1

Eu tenho um arquivo que contém várias linhas. Algumas linhas representam a data e a hora, mas essa hora está no formato Epoch. Eu tentei usar algum comando, mas esse comando converteu todos os dígitos numéricos. Eu quero converter apenas o que é aplicável. O mesmo arquivo é como abaixo: -

cat FORMATTED 
=============================================================
0='917598936722' 395='1529313008' 391='0' 165='0' 142='0' 131='Status_Pending'
=============================================================

0='917598936722'    :MSISDN  
131='Status_Pending':PROMO_TP3_STATUS  
142='0'             :USAGE_COUNT_3_STATUS  
165='0'             :EBUCKET_USAGE_TS_3  
391='0'             :PROM_3_END_TIMESTAMP  
395='1529313008'    :Date_TC1  
396=='1529313008'   :TC2

Eu preciso converter o tempo de época presente nas linhas Date_TC1 e TC2 . Similar a isso, existem muitas outras linhas e eu não sei qual linha representa a data / hora da Epoch; mas onde esta data / hora está presente no formato Epoch, eu preciso converter para o formato legível.

    
por Prince Garg 09.08.2018 / 13:19

2 respostas

1

cat conv.awk

/Date_TC1/||/TC2/   {
    split($0, r, "'")
    print(r[1], strftime("%c", r[2]), r[3], r[4])
    next
    }

{ print }

awk -f conv.awk src.txt
=============================================================
0='917598936722' 395='1529313008' 391='0' 165='0' 142='0' 131='Status_Pending'
=============================================================

0='917598936722'    :MSISDN  
131='Status_Pending':PROMO_TP3_STATUS  
142='0'             :USAGE_COUNT_3_STATUS  
165='0'             :EBUCKET_USAGE_TS_3  
391='0'             :PROM_3_END_TIMESTAMP  
395= Mon 18 Jun 2018 11:10:08 AM CEST     :Date_TC1   
396== Mon 18 Jun 2018 11:10:08 AM CEST    :TC2 
    
por 09.08.2018 / 14:43
0

Usando GNU sed , tente isto:

sed -re 's/([0-1][0-6][0-9]{8})/$(date -d @&)/g;
         /date -d/ s/\x27/\\x27/g;
         /date -d/ s/\$[^(]/\$\(/g;
         /date -d/ s/.*/echo &/e' FORMATTED

Explicação:

  • s/([0-1][0-6][0-9]{8})/$(date -d @&)/g : substitua todos os registros de data e hora (10 dígitos com 00 - 16 como primeiros números) por $(date -d @<timestamp>)

  • /date -d/ : Só execute os seguintes comandos quando date -d foi encontrado na linha (= linhas que alteramos na etapa anterior)

  • s/\x27/\\x27/g : substitua todos os ' por \' para que tudo entre seja seja interpretado na última etapa.

  • s/\$[^(]/\$\(/g; : substitua todos os $ que não são seguidos por ( com \$ , para que eles não sejam interpretados como variáveis na última etapa

  • s/.*/echo &/;e : execute ( e ) um echo na linha inteira ( .* )

Note: This behaves similar to eval, executing everything that is in the original file, e.g. 'do_something_evil'.

( via )

    
por 09.08.2018 / 15:27