staging.inyokaproject.org

Zeilen zusammenfügen mit AWK

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

STIFT-ENIG

Anmeldungsdatum:
1. September 2014

Beiträge: Zähle...

Hallo zusammen,

ich krampfe gerade mit awk etwas rum. Ich habe eine Ausgabe wie diese in einer Text Datei:

1
2
3
4
5
FastEthernet2/1 is down, line protocol is down (notconnect) 
  Last input 10w3d, output never, output hang never
....
FastEthernet7/43 is down, line protocol is down (notconnect) 
  Last input never, output never, output hang never

Ich würde gerne die jeweils zugehörigen Zeilen zusammenfügen in etwa so:

1
2
3
FastEthernet2/1 is down, line protocol is down (notconnect) Last input 10w3d, output never, output hang never
....
FastEthernet7/43 is down, line protocol is down (notconnect) Last input never, output never, output hang never

Der Hintergrund ist folgender, ich bin Netzwerker und versuche so Switche mit unnötigen Ports zu disablen. Später möchte ich eine Liste nur mit den gefillterten Ports haben. So könnte ich hinterher mit '{ if($11 == 'never') printf($1)}' alle Ports ausgeben welche gar nicht benutzt wurden. Vlt kann mir jemand dabei ein Tipp geben, awk sollte aber der beste Weg für die Aufgabe sein oder was meint Ihr?

Viele Grüße

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

STIFT-ENIG schrieb:

Vlt kann mir jemand dabei ein Tipp geben, awk sollte aber der beste Weg für die Aufgabe sein oder was meint Ihr?

Das kommt immer darauf an, ob du das Skript in ein paar Wochen noch verstehen können willst... - zumindest ist es schön kurz:

1
awk '/^FastEthernet/{printf "%s", $0; getline; print}{print}' test.txt

Edit: abschließendes {print} ergänzt, sonst druckt er andere Zeilen nicht.

STIFT-ENIG

(Themenstarter)

Anmeldungsdatum:
1. September 2014

Beiträge: Zähle...

Erstmal muss ich es jetzt verstehen. Kurz zu Erläuterung: der Einzeiler guckt, nach dem String "FastEthernert" und spuckt die Zeile aus. Den Ausdruck "getline" kannte ich nicht, der gibt einfach den nächsten Record der Zeile aus?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

STIFT-ENIG schrieb:

Erstmal muss ich es jetzt verstehen. Kurz zu Erläuterung: der Einzeiler guckt, nach dem String "FastEthernert" und spuckt die Zeile aus. Den Ausdruck "getline" kannte ich nicht, der gibt einfach den nächsten Record der Zeile aus?

getline holt sich die nächste Zeile aus der Datei.

Wenn eine Zeile mit "FastEthernet" anfängt, gibt er sie ohne Zeilenende aus, und holt sich die nächste Zeile, die er mit Zeilenende druckt. Ansonsten führt er den Ausdruck in den nachfolgenden geschweiften Klammern aus.

Mir ist aber gerade aufgefallen, dass ich vergessen habe dann noch mit next zur nächsten Zeile zu wechseln und die Regel von vorne abarbeiten zu lassen, sonst druckt er die angehängte Zeile doppelt:

1
awk '/^FastEthernet/{printf "%s", $0; getline; print; next}{print $0}' test.txt

Mit Python3 fällt mir sowas deutlich leichter:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input():
    if line.startswith('FastEthernet'):
        line = line.rstrip()
    print(line, end='')

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Im Prinzip kann man die Logik im awk-Skript auch noch verkürzen:

1
awk '/^FastEthernet/{printf "%s", $0; next}{print}' test.txt

STIFT-ENIG

(Themenstarter)

Anmeldungsdatum:
1. September 2014

Beiträge: 12

Ich werde die AWK Variante nehmen. So muss ich nicht extra ein Script erstellen. Vielen dank für die Antwort, damit kann ich weiter arbeiten!

Antworten |