Script um bestimme Zeilen einer Datei auszulesen

M

Midyr

Grünschnabel
Hallo,

ich habe u.g Textfile.

Daraus möchte ich für jeden Block (Beginnend mit id) eine Zeile mit der id, dem namen und den 2-4 WWPN in eine andere Datei speichern.
Der String "port_count" gibt die Anzahl der WWPNs an


Wie kann ich das am Einfachsten per Bash bewerkstelligen?

Gruß und Danke Frank

Code:
id 0
name sasadad
port_count 2
type asdasd
mask 1111111111111111111111111111111111111111111111111111111111111111
iogrp_count 4
status degraded
WWPN 555555555
node_logged_in_count 0
state offline
WWPN 4444444
node_logged_in_count 1
state degraded
id 1
name sdfsdfsdfdsf
port_count 2
type generic
mask 1111111111111111111111111111111111111111111111111111111111111111
iogrp_count 4
status degraded
WWPN 5656565656
node_logged_in_count 0
state offline
WWPN 45654654
node_logged_in_count 1
state degraded
id 2
name 5645654
port_count 2
type generic
mask 1111111111111111111111111111111111111111111111111111111111111111
iogrp_count 4
status degraded
WWPN 565465
node_logged_in_count 0
state offline
WWPN 645645
node_logged_in_count 1
state degraded
id 3
name asdasdasd
port_count 6
type generic
mask 1111111111111111111111111111111111111111111111111111111111111111
iogrp_count 4
status degraded
WWPN sdfdsfdsf
node_logged_in_count 1
state degraded
WWPN fsdfdfdsfsd
node_logged_in_count 1
state degraded
WWPN sdfsdfdsfds
node_logged_in_count 1
state degraded
WWPN 64565656
node_logged_in_count 1
state degraded
WWPN 466456
node_logged_in_count 1
state degraded
WWPN dasdasdas
node_logged_in_count 1
state degraded
 
Datei mit Schleife $Zeile für $Zeile auslesen, Test ob "id" in $Zeile vorkommt, wenn ja, $Variable mit Wert von id belegen und $Zeile in Datei $Variable schreiben.
 
Moin,

danke für die Antwort.

Wie bekomme ich aber die Zeilen der Datei?
Meine Versuche mit cat, read line und greppen in einer Schleife sind immer nach dem ersten Fund von id gestoppt

gruß
 
Poste den Versuch doch mal - dann haben wir was handfestes zum debuggen.

Ach ja -
Code:
-Tags wären da gern gesehen, so wegen der Lesbarkeit.
 
Poste den Versuch doch mal - dann haben wir was handfestes zum debuggen.

Ach ja -
Code:
-Tags wären da gern gesehen, so wegen der Lesbarkeit.[/QUOTE]

[code]
#! /bin/bash
cat WWPN | while read line; 
do
        id=$(echo $line |grep  id);
        echo "$id";
        if [ "$id" ]
        then
                name=$(echo $line| grep name);         
                echo "ID: $id"
                echo "Name: $name"
        fi
done

Ok, halbwegs ausgeschlafen sehe ich, dass es nicht klappen kann, weil ich in der Schleife ja die Zeile mit id bearbeite.
Aber wie kann ich an der aktuellen Zeile weiter suchen?

Oder ist mein Ansatz totaler Käse?

Gruß
 
Evtl. einfach in sed: id-Zeile merken (in den Hold-Puffer nehmen), name- und WWPN-Zeilen anhängen, und das Ganze ausgeben, wenn wir das nächste mal über eine id-Zeile stolpern oder ans Dateiende kommen:

Code:
sed -n -e 's/id //;Ta;x;s/\n / /g;p;d;:a s/name//;Tb;H;:b s/WWPN//;Tc;H;:c $bd;d;:d x;s/\n / /g;p;'

Wer so etwas wirklich einsetzt, ist vermutlich selbst schuld ;-)

A.
 
"einfach in sed" - der war gut...

*rofl*

In Perl bekommt man das sicher auch in eine Zeile, aber manchmal ist ein Script doch irgendwie lesbarer und ggf. auch besser zu warten...
 
Unglaublich aber wahr, der Buchstabensalat funktioniert:devil:

Vielen Dank

Midyr
 
Das ist aber kein schoener sed-Code: 'T' setzt labels, und das ist doch bei einem echten Stream nicht moeglich: wenn die Zeile vorbei ist, ist sie vorbei. Ist laut Doku auch spezifisch fuer GNU sed.
 
Hi tgruene,

kann nur zustimmen:

- "schön" ist anders
- 'T' ist GNU-sed-spezifisch, läuft ggf. also nicht auf anderen Betriebssystemen ausser Linux.

Das war also nur ein Schnellschuss zur einmaligen Verwendung, daher auch meine o.a. Bemerkung ("Wer so etwas wirklich einsetzt, ...")

Mit ein bisschen Überlegung liesse sich das ein bisschen optimieren und ohne Verwendung von GNU-Eigenheiten z.B. umschreiben zu
Code:
sed -n -e 's/id //;tb;s/name//;ta;s/WWPN//;ta;$!d;bb;:a H;d;:b x;s/\n / /g;/^./p;'

und falls die Absicht besteht, das in Skriptform für die Ewigkeit aufzubewahren, könnte man das dann ausformulieren zu
Code:
sed -n -e '
                s/id //;        # id-Zeile finden, Keyword löschen
                tb;             # weiter bei :b, falls id

                s/name//;       # name finden
                ta;             # weiter bei :a, falls name

                s/WWPN//;       # WWPN
                ta;             # falls WWPN, auch weiter bei :a

                $!d;            # alles andere löschen und weiter zur nächsten
                                # Zeile (d), ausser am Dateiende
                bb;             # weiter bei b (zur Verarbeitung der letzten Zeile)

        :a
                H;              # aktuell gefundene Zeile an hold-Buffer anhängen
                                # (Keywords wurden bereits entfernt)
                d;              # aktuelle Zeile löschen, nächste einlesen

        :b
                x;              # Hold-Buffer mit Pattern-Space austauschen
                s/\n / /g;      # ersetze NLs mit Spaces
                /^./p;          # Ausgabe, falls irgendwelche Daten (vermeidet
                                #Leerzeile bei erstem 'id')
'

Aber natürlich kann mal Labels in sed-Skripten (auch bei Nicht-GNU-sed-Versionen) verwenden - die beziehen sich auch nicht auf Positionen innerhalb der zu verarbeitenden Daten im Eingabe-Stream, sondern dienen nur zum Anspringen der Befehle innerhalb des sed-Skripts ...

Grüsse,
A.
 

Ähnliche Themen

Raid5 spare nach rebuild "verschwunden"?

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

.cfg Datei Analysieren und Zeilen Stellenweise abändern

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Werte aus Dateien lesen

Zurück
Oben