Jak przekonwertować znaczniki czasu w kolumnie na datę?


15

Mam plik zawierający to:

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

Chcę przekonwertować znacznik czasu na datę w tym formacie:

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

Jak mogę to zrobić?

Wiem, że to działa: perl -pe 's/(\d+)/localtime($1)/e'(z tego pytania ), ale format wyjściowy to Mon Nov 10 02:00:03 2014.

Wiem, że to polecenie może konwertować znaczniki czasu na pożądane dane wyjściowe:, date -d@1415602803 +"%F %H:%M:%S"ale nie mogłem sprawić, by działało z awkużyciem z system("cmd")powodu wszystkich cytatów i tak dalej.

Odpowiedzi:


6

Być może tak

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

17

Znaleziono coś tutaj: Stackoverflow - Konwertuj z unixtime w wierszu poleceń .

Wymyśliłem to:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","użyć separatora pól ,,
  • OFS=",";tak że pola wyjściowe są również oddzielone przez ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);zmienić wartość pierwszego pola $1na określony format, oraz
  • print $0; aby wydrukować całą linię.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'daje awk: line 2: function strftime never definedtutaj. Wyjaśnij, że NIE KAŻDY AWK ma strftime()! Aby uzyskać rozwiązanie działające w większości (wszystkich?) Zestawach AWK, użyj zewnętrznego datepolecenia, aby pozostać przenośnym.

2
@yeti, istnieje kilka dateimplementacji, które mogą konwertować daty między formatami jako rozszerzenie, ale sposób ich wykonania różni się całkowicie między implementacjami. Na przykład rozwiązanie podane przez Costasa wykorzystuje składnię specyficzną dla GNU date. Jeśli chcesz mieć przenośność, użyj perl.
Stéphane Chazelas,

4

Jeśli chcesz awk, możesz użyć zewnętrznego polecenia datew dowolnym formacie daty

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

+1 za NIEUŻYWANIE strftime()!

4
Zauważ, że użycie zewnętrznego polecenia spowoduje poważne pogorszenie wydajności, szczególnie zauważalne, gdy przetwarzanych jest wiele tysięcy wierszy
Jose Gómez

2

Możesz także spróbować:

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

2

Zadałem pytanie 9 miesięcy temu, które oznaczono jako duplikat tego. Dopiero teraz zobaczyłem prośbę o opublikowanie odpowiedzi, która działała dla mnie na to pytanie. Oto link do tego pytania i odpowiedzi.

/unix//a/304009/172916

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.