GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Muster an Zeilenanfang verschieben?

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.

  • \(.*\) entspricht blah, 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.

Verwandte:Sudo-Zeitüberschreitung während eines lang laufenden Skripts?
Ubuntu
  1. Verwenden von Sed zum Suchen und Ersetzen einer Linie zwischen Musterbereichen

  2. So fügen Sie Text am Anfang jeder Zeile in Vim ein

  3. Vorherige Zeile nach einer Musterübereinstimmung mit Sed drucken?

  4. Wie verschiebt man eine Zeile in einer Textdatei um eine Zeile nach oben oder unten?

  5. Muster finden und verschieben?

So verschieben Sie Verzeichnisse unter Linux

So verschieben Sie GNOME-Shell-Benachrichtigungen

So führen Sie eine Mustersuche in Dateien mit Grep durch

So verschieben Sie ein Verzeichnis unter Linux

Befehlszeilen-Audioplayer?

Kaufmännisches Und am Anfang einer Zeile in csh