Wie kann ich Zeitstempel in einer Spalte in ein Datum konvertieren?

15

Ich habe eine Datei, die Folgendes enthält:

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

Ich möchte den Zeitstempel in ein Datum in diesem Format konvertieren:

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

Wie kann ich das machen?

Ich weiß, dass dies funktioniert: perl -pe 's/(\d+)/localtime($1)/e'(aus dieser Frage ) aber das Ausgabeformat ist Mon Nov 10 02:00:03 2014.

Ich weiß , dass dieser Befehl Zeitstempel in meine gewünschten Ausgabe umwandeln kann: date -d@1415602803 +"%F %H:%M:%S", aber ich konnte es nicht funktioniert awkmit , system("cmd")weil alle Zitate und so weiter.

Alaa Ali
quelle

Antworten:

6

So vielleicht

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

Hier wurde etwas gefunden: Stackoverflow - Konvertieren von Unixtime in der Befehlszeile .

Kam mit diesem auf:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","ein Feldtrennzeichen von verwenden ,,
  • OFS=",";damit die Ausgabefelder auch durch ein getrennt sind ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);den Wert des ersten Feldes $1in das angegebene Format zu ändern , und
  • print $0; um die ganze Zeile zu drucken.
Alaa Ali
quelle
2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'gibt awk: line 2: function strftime never definedhier. Bitte klären Sie, dass NICHT JEDES AWK hat strftime()! Verwenden Sie für eine Lösung, die in den meisten (allen?) AWKs ausgeführt wird, den dateBefehl external , um portabel zu bleiben.
2
@yeti, es gibt einige dateImplementierungen, die Datumsangaben zwischen Formaten als Erweiterung konvertieren können, aber die Vorgehensweise ist zwischen den Implementierungen völlig unterschiedlich. Beispielsweise verwendet die von Costas bereitgestellte Lösung eine für GNU spezifische Syntax date. Wenn Sie Portabilität wünschen, verwenden Sie perl.
Stéphane Chazelas
4

Wenn Sie möchten awk, können Sie externe Befehle datefür beliebige Datumsformate verwenden

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
Costas
quelle
+1 für NICHT verwenden strftime()!
4
Beachten Sie, dass die Verwendung eines externen Befehls schwerwiegende Leistungseinbußen zur Folge hat, insbesondere dann, wenn viele tausend Zeilen verarbeitet werden
Jose Gómez,
2

Sie können auch versuchen:

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

Ich habe vor 9 Monaten eine Frage gestellt, die als Duplikat dieser Frage markiert war. Ich habe gerade erst eine Anfrage zum Posten der Antwort gesehen, die für mich bei dieser Frage funktioniert hat. Hier ist ein Link zu dieser Frage und Antwort.

/unix//a/304009/172916

Emily Shaffer
quelle