Ich habe eine Protokolldatei mit diesem Protokollformat:
###<Aug 8, 2016 11:59:05 PM>
different text
...
different text
###<Aug 15, 2016 9:10:55 AM>
different text
...
...
...
different text
###<Aug 22, 2016 10:02:17 PM>
different text
...
...
...
...
different text
###<Sep 1, 2016 1:00:01 AM>
different text
###<Sep 7, 2016 3:00:01 PM>
different text
...
...
different text
Wie teile ich diese Protokolldatei nach Datum in Dateien YYYY_MM_DD.log auf?
text-processing
sed
awk
tm4ig
quelle
quelle
axe
Befehl.Antworten:
Eine
perl
Lösung, die GNU nutztdate
, um die Daten zu konvertieren:Erläuterung
-ne
: Lesen Sie die Eingabedatei zeilenweise (speichern Sie jede Zeile als spezielle Variable$_
) und wenden Sie das von-e
jeder Zeile angegebene Skript an.if(/^###<(.*)>/)
: Wenn die Zeile mit beginnt###<
, erfassen Sie alles zwischen dem<>
as$1
(das tun die Klammern).chomp($d=
Datum -d "$ 1" +% Y_% m_% d);
: Derdate
Befehl formatiert das Datum neu. Zum Beispiel:Das
chomp
entfernt die letzte neue Zeile aus dem Ergebnis von,date
damit wir sie später verwenden können.$name="$d.log"
: Wir speichern das Ergebnis desdate
Befehls plus.log
als Variable$name
.open(my $fh,">>","$name");
: Öffnen Sie die Datei$name
als Dateihandle$fh
. Machen Sie sich keine Sorgen, wenn Sie nicht wissen, was ein Dateihandle ist. Dies bedeutet nur, dassprint $fh "foo"
es gedrucktfoo
wird$name
.print $fh $_;
: Druckt die aktuelle Zeile in die Datei, auf die das Dateihandle$fh
zeigt. Drucken Sie die Zeile also in die aktuell gespeicherte Zeile$name
.quelle
Ein Ansatz zur Lösung dieses Problems könnte die Verwendung von awk sein. Zum Beispiel dieser Befehl:
sollte die Datei in die Dateien aufteilen und die Datumsfelder als Dateinamen verwenden
quelle
2016_Sep_1.log
Stattdessen hat2016_09_01
das OP meiner Meinung nach darum gebeten.date
Befehl wie in den beiden anderen Antworten zu verwenden.Mit
awk
:Lesbare Form:
/^#+<[^>]+>$/
Entspricht den Zeilen, die Datumsangaben enthalten, wird der von umgebene{}
Block nur ausgeführt, wenn die Bedingung übereinstimmt. Wenn Übereinstimmungen vorliegen, erhalten wir das Datum im gewünschten Format, indem wir einen externendate
Befehl verwenden, die Ausgabe in einer Variablenfile
speichern und den Inhalt der Variablenlines
bis zur Dateifile
(aus dem vorherigen Block) speichern und die Variable dannlines
erneut mit der Zeile instanziierenFür alle anderen Zeilen verketten wir die Zeilen als Variable
lines
Der letzte
END
Block wird durch Einfügen in den Block gespeichertquelle