awk: Leerzeichen loswerden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
katze123
Beiträge: 88
Registriert: 10.06.2016 20:05:47

awk: Leerzeichen loswerden

Beitrag von katze123 » 07.12.2018 18:19:49

Wenn ich folgenden Befehl ausführe

Code: Alles auswählen

awk '/>f+++++++++/ {$1=""; $2=""; $3=""; $4=""; print $0}' log001.txt > 001.txt
hat jede Zeile von 001.txt vier Leerzeichen am Anfang. Ich möchte diese Leerzeichen aber nicht, jede Zeile soll mit dem Inhalt der fünften Spalte beginnen. Wie muss ich meinen Befehl verändern?

Benutzeravatar
Meillo
Moderator
Beiträge: 9228
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: Leerzeichen loswerden

Beitrag von Meillo » 07.12.2018 18:50:27

katze123 hat geschrieben: ↑ zum Beitrag ↑
07.12.2018 18:19:49
Wenn ich folgenden Befehl ausführe

Code: Alles auswählen

awk '/>f+++++++++/ {$1=""; $2=""; $3=""; $4=""; print $0}' log001.txt > 001.txt
hat jede Zeile von 001.txt vier Leerzeichen am Anfang. Ich möchte diese Leerzeichen aber nicht, jede Zeile soll mit dem Inhalt der fünften Spalte beginnen. Wie muss ich meinen Befehl verändern?
Indem du die vier Leerzeichen noch wegschneidest:

Code: Alles auswählen

awk '/>f+++++++++/ {$1=""; $2=""; $3=""; $4=""; sub(/^    /,""); print $0}' log001.txt > 001.txt
Oder so:

Code: Alles auswählen

<log01.txt egrep '>f+++++++++' | cut -d' ' -f 5- >001.txt

Auf was genau soll eigentlich die RE />f+++++++++/ matchen?
Use ed once in a while!

katze123
Beiträge: 88
Registriert: 10.06.2016 20:05:47

Re: awk: Leerzeichen loswerden

Beitrag von katze123 » 08.12.2018 13:44:02

Danke für die Antwort, klappt wunderbar!
Meillo hat geschrieben: ↑ zum Beitrag ↑
07.12.2018 18:50:27
Auf was genau soll eigentlich die RE />f+++++++++/ matchen?
Es geht um ein rsync-logfile, die Fehlermeldungen sollen nicht in 001.txt eingetragen werden.

Benutzeravatar
Meillo
Moderator
Beiträge: 9228
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: Leerzeichen loswerden

Beitrag von Meillo » 08.12.2018 17:13:49

katze123 hat geschrieben: ↑ zum Beitrag ↑
08.12.2018 13:44:02
Meillo hat geschrieben: ↑ zum Beitrag ↑
07.12.2018 18:50:27
Auf was genau soll eigentlich die RE />f+++++++++/ matchen?
Es geht um ein rsync-logfile, die Fehlermeldungen sollen nicht in 001.txt eingetragen werden.
Dafuer ist die RE falsch. AWK verwendet EREs, dort ist `+' ein Quantifier.

Deine RE sucht eine schliessende spitze Klammer gefolgt von einem `f', das ein oder mehrmals auftaucht (dafuer sorgt das erste Plus). Die weiteren Plus-Zeichen machen eigentlich gar keinen Sinn und werden folglich wohl einfach ignoriert, denn siehe worauf die RE alles matcht:

Code: Alles auswählen

$ awk '/>f+++++++/' /tmp/foo
>f+++++++++
>ffff
>ffff+
>ffff+++++
Das ist das gleiche Ergebnis, wie wenn ich nur nach />f+/ suche.

Die korrekte RE in awk (und egrep) ist:

/>f\+\+\+\+\+\+\+\+\+/

oder:

/>f\+{9}/

(Diese zweite Form wird aber in ein paar aelteren awk-Implementierungen nicht unterstuetzt.)


Du kannst alternativ aber auch das normale grep verwenden, das kennt keinen Plus-Quantifier, folglich geht:

Code: Alles auswählen

grep '>f+++++++++' | cut ...
Oder diese Komplettloesung mit sed (das auch keine Plus-Quantifier kennt):

Code: Alles auswählen

<log01.txt sed -n '/>f+++++++++/s/^\([^ ]* \)\{4\}//p' >001.txt
Oder, zwar nicht ganz so exakt aber ebenso wirksam und kuerzer:

Code: Alles auswählen

<log01.txt sed -n 's/^.*>f+++++++++ //p' >001.txt

Such's dir aus. ;-)
Use ed once in a while!

Antworten