Come posso convertire i timestamp in una colonna in una data?


15

Ho un file contenente questo:

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

Voglio convertire il timestamp in una data in questo 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

Come posso fare ciò?

So che funziona: perl -pe 's/(\d+)/localtime($1)/e'(da questa domanda ) ma il formato di output è Mon Nov 10 02:00:03 2014.

So che questo comando può convertire i timestamp nell'output desiderato:, date -d@1415602803 +"%F %H:%M:%S"ma non sono riuscito a farlo funzionare con l' awkuso a system("cmd")causa di tutte le citazioni e quant'altro.

Risposte:


6

In questo modo forse

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

17

Trovato qualcosa qui: StackOverflow - Converti da unixtime alla riga di comando .

È venuto con questo:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","utilizzare un separatore di campo di ,,
  • OFS=",";in modo che anche i campi di output siano separati da un ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);per modificare il valore del primo campo $1nel formato specificato e
  • print $0; per stampare l'intera riga.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'awk: line 2: function strftime never definedqui. Si prega di chiarire che NON OGNI AWK ha strftime()! Per una soluzione in esecuzione nella maggior parte (tutti?) Degli AWK, utilizzare il datecomando esterno per rimanere portatile.

2
@yeti, ci sono alcune dateimplementazioni che possono convertire le date tra i formati come estensione, ma il modo in cui viene fatto varia completamente tra le implementazioni. Ad esempio, la soluzione fornita da Costas utilizza una sintassi specifica per GNU date. Se si desidera la portabilità, utilizzare perl.
Stéphane Chazelas,

4

Se lo awkdesideri, puoi utilizzare un comando esterno datecon qualsiasi formato di data

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

+1 per NON usare strftime()!

4
Si noti che l'uso di un comando esterno comporterà un grave calo delle prestazioni, particolarmente evidente se vengono elaborate molte migliaia di righe
Jose Gómez,

2

Puoi anche provare:

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

2

Ho fatto una domanda 9 mesi fa che è stata contrassegnata come una copia di questa. Ho visto solo ora una richiesta per pubblicare la risposta che ha funzionato per me su questa domanda. Ecco un link a quella domanda e risposta.

/unix//a/304009/172916

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.