Ich versuche, eine Protokolldatei so neu zu formatieren, dass Datum und Uhrzeit am Anfang der Zeile erscheinen. Meine Protokolle sehen so aus:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Ich möchte, dass sie so aussehen:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Ich bin so weit gegangen, das richtige grep-Muster mit grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
.
Wie kann ich diese Musterergebnisse links von der Informationszeichenfolge verschieben? Danke für deine Hilfe.
Akzeptierte Antwort:
Versuchen Sie es mit sed
mit dem folgenden regulären Ausdruck:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Hier haben wir den sed
verwendet ’s-Gruppensubstitutionsmethode, um die gewünschte Ausgabe zu erhalten.
\(.*\)
entsprichtblah, blah, blah
da wir,[[:blank:]]
haben passend zu,
danach.\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
entspricht dem verbleibenden Teil der Zeile (dem Teil, den wir an den Anfang setzen möchten).
Dann haben wir \2 \1
um die zweite Gruppe zuerst zu setzen und dann ein Leerzeichen und dann die erste Gruppe.
Die Originaldatei wird als file.txt.bak
gesichert , wenn Sie das nicht möchten, verwenden Sie einfach -i
statt -i.bak
.
**Obwohl Sie die gewünschte Ausgabe erhalten, ist die Verwendung von Regex/sed in diesem Fall nicht die optimale Lösung.
BEARBEITEN: Wenn Sie eine Zeile wie [Internet disconnected] Friday, Mar 13,2015 15:48:34
haben , versuchen Sie Folgendes:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
In der vorherigen Regex hatten wir \(.*\),[[:blank:]]
(ein Komma und ein Leerzeichen nach der ersten übereinstimmenden Gruppe), um nun die neue Zeile in die Ausgabe aufzunehmen, haben wir die erste übereinstimmende Gruppe \(.*[^,]\)
erstellt um sicherzustellen, dass es nicht mit einem Komma endet, und dann haben wir ,*
abgeglichen d.h. ein oder mehrere Kommas. Also der neue sed
Der Befehl funktioniert in allen genannten Fällen.