Como posso converter carimbos de data e hora em uma coluna em uma data?


15

Eu tenho um arquivo contendo isso:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Quero converter o carimbo de data e hora em uma data neste formato:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Como eu posso fazer isso?

Eu sei que isso funciona: perl -pe 's/(\d+)/localtime($1)/e'(a partir desta pergunta ), mas o formato de saída é Mon Nov 10 02:00:03 2014.

Eu sei que este comando pode converter timestamps em minha saída desejada: date -d@1415602803 +"%F %H:%M:%S", mas eu não poderia fazê-lo funcionar com o awkuso system("cmd")por causa de todas as citações e outros enfeites.

Respostas:


6

Assim talvez

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 

17

Encontrei algo aqui: Stackoverflow - Converta do unixtime na linha de comando .

Veio com isso:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F"," para usar um separador de campos de , ,
  • OFS=","; para que os campos de saída também sejam separados por um , ,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1); para alterar o valor do primeiro campo $1 para o formato especificado e
  • print $0; para imprimir a linha inteira.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'awk: line 2: function strftime never definedaqui. Esclareça que nem todo AWK possui strftime()! Para uma solução em execução na maioria dos AWKs (todos?), Use o datecomando externo para permanecer portátil.

2
@yeti, existem algumas dateimplementações que podem converter datas entre formatos como uma extensão, mas como isso é feito varia completamente entre as implementações. Por exemplo, a solução fornecida por Costas usa uma sintaxe específica para o GNU date. Se você deseja portabilidade, use perl.
Stéphane Chazelas

4

Se desejar, awkvocê pode usar o comando externo datecom qualquer formato de data

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

+1 por NÃO usar strftime()!

4
Note que usando um comando externo terã uma queda de desempenho grave, especialmente perceptível se muitos milhares de linhas estão sendo processados
José Gómez

2

Você também pode tentar:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash

2

Eu fiz uma pergunta há 9 meses que foi marcada como uma duplicata desta. Acabei de ver um pedido para postar a resposta que funcionou para mim nessa questão. Aqui está um link para essa pergunta e resposta.

/unix//a/304009/172916

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.