mal ne simple grep Frage [GELÖST]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

mal ne simple grep Frage [GELÖST]

Beitrag von chu-i » 08.02.2006 02:13:38

Also erstmal sorry dafür. Offensichtlich habe ich da einen Denkfehler, komme aber nicht dahinter.

Ich möchte aus der Datei /var/lib/dpkg/available alle Pakete herausfilter die NICHT zur Priorität: standart gehören.

Code: Alles auswählen

grep -v -B2 -A1 ^"Priority: standard" available
Zur weiteren Bearbeitung benötige ich noch zwei Zeilen über und eine unter dem Suchergebnis.
Daher die Optionen -A1 -B2.

Der obige Code gibt die gesamte Datei, völlig ungefilter aus!

Lasse ich die Option -v weg, bekomme ich dann das in diesem Fall richtige, jedoch nicht gewünschte Ergebnis und er zeigt mir alle Pakte mit der Priorität: standart an. :roll:

Warum funktionieren die Optionen -A -B nicht mit -v und wie kann ich meine Aufgabe dennoch elegant lösen?

bzw. Ist das bei euch und einer beliebigen Datei auch der Fall???
Zuletzt geändert von chu-i am 21.05.2006 16:35:55, insgesamt 3-mal geändert.
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

yeti

Beitrag von yeti » 08.02.2006 04:09:23

Ich halte das eher für einen typischen Job für awk:

Code: Alles auswählen

awk < /var/lib/dpkg/available '
BEGIN { PA=PR=SE=IS="" }
/^Package: / { PA=$2 }
/^Status: / { SE=$2 }
/^Priority: / { PR=$2 }
/^Installed-Size: / { IS=$2 }
/^$/ { if (PR!="standard") printf "%s %s %s %s\n",PA,PR,SE,IS ; PA=PR=SE=IS="" }'

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 08.02.2006 04:18:56

Code: Alles auswählen

cat /var/lib/dpkg/available | grep -A3 '^Package:' | grep -v '^Priority: standard'
Das sollte das gewünschte Ergebis liefern.
Dein Problem war, daß du die gesammte Zeile invertiert hast. Damit wurden natürlich auch alle Zeilen ausgegeben, die kein "^Priority: standard" enthielten (und das ist nunmal fast die gesammte Datei :-) )
Zuletzt geändert von ToPeG am 11.02.2006 23:19:39, insgesamt 1-mal geändert.

Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

Beitrag von chu-i » 08.02.2006 08:31:58

Vielen Dank für die rasche und qualifizierte Hilfe. :D

Dank Dir yeti. Ich gebe zu das ich awk nicht nutze auch wenn mir klar ist das ich das sollte, weil bei komplexeren Sachverhalten es sicherlich mit awk eleganter geht.
Doch wie du vielleicht zugeben wirst, ist die Lösung von ToPeG mit klassischem pipen diesmal etwas kürzer. 8)
Auf jedenfall hast Du erreicht das ich mir mal ein awk Tutorial durchziehe. :wink:

ToPeG, vielen Dank. Ich sehe auch das es funtzt, nur verstehe kann ich das nicht. 8O
Nach deiner letzten Pipe sind unsere Befehle doch eigentlich identisch.
Vorher separierst du doch nur nochmal nach Package ...

Bisher dachte ich auch immer das -v sich auf das Suchstring bezieht ... wieso invertiere ich dann (laut deiner Erklärung) die ganze Zeile.
Weiterhin hab ich mir mal meine Ausgabe angeschaut, da kommt alles drin vor:
Priority: standard, extra, optional, usw.
Wenn grep irgend was machen sollte, invertieren oder was weiß ich. Dann sollte doch auch eine Veränderung sichtbar sein :?:

Ehrlich, da steig ich nicht durch. Also wenn jemand langeweile hat, kann er mir da ja mal Idiotensicher erklären. Ansonsten ist auch nicht so schlimm, muß ich mal etwas Zeit darauf verwenden und mir das selbst herleiten. :cry:
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 08.02.2006 15:31:00

Allso nehmen wir mal testhalber folgende RegExp:

Code: Alles auswählen

grep -v -A2 -B1 '^Priority: standard'
Allso wie arbeitet es sich durch die Datei http://nopaste.debianforum.de/2399 ?

Code: Alles auswählen

1. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> nein, das ist ein Treffer
    -> Nehme die Zeile mit
    -> Nehme keine Zeile darüber mit (Zähler < 0)
    -> Nehme zwei Zeilen darunter mit
2. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> nein, das ist ein Treffer
    -> Nehme die Zeile nicht mit ( Ist schon in der Ausgabe)
    -> Nehme keine Zeile darüber mit ( Ist schon in der Ausgabe)
    -> Nehme erste Zeile darunter nicht mit ( Ist schon in der Ausgabe)
    -> Nehme zweite Zeile darunter mit
3. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> nein, das ist ein Treffer
    ...

14. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> nein, das ist ein Treffer
    -> Nehme die Zeile nicht mit ( Ist schon in der Ausgabe)
    -> Nehme keine Zeile darüber mit ( Ist schon in der Ausgabe)
    -> Nehme erste Zeile darunter nicht mit ( Ist schon in der Ausgabe)
    -> Nehme zweite Zeile darunter mit
15. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> Ja , allso ignorieren.
16. Zeile:
  ->Sieht sie nach '^Priority: standard' aus?
  -> nein, das ist ein Treffer
    -> Nehme die Zeile nicht mit ( Ist schon in der Ausgabe)
    -> Nehme keine Zeile darüber mit ( Ist schon in der Ausgabe)
    -> Nehme erste Zeile darunter mit
    -> Nehme zweite Zeile darunter mit
...
Es kommt hinzu, daß grep erkennt wenn eine Pipe von einem andren "grep" kommt und die Suchergebnisse Fundweise abarbeitet ( das macht er aber nur mit der Option "-v" wie es scheint ) Damit ist es dann möglich aus den gefundenen Blöcken jene raus zu schmeißen, bei denen eine Zeile ins Suchmuster passt.
Zuletzt geändert von ToPeG am 11.02.2006 23:14:40, insgesamt 1-mal geändert.

Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

Beitrag von chu-i » 11.02.2006 23:07:39

ToPeG du bist spitze! :D

Dank Dir für die viele Mühe, jetzt habe ich es gerafft.
Okay, das grep eine Pipe von grep erkennt und mit der Option -v dann noch anders reagiert finde ich "interessant". :wink:

Da werde ich das nächstemal mehr aufpassen müssen.
Jetzt schau ich mir mal die manpages genauer an.
Ob das wohl drin steht, wahrscheinlich nicht ...

Mein vagantes Problem hast Du ja schon vorher lösen können.

Danke nochmal, für die gute Hilfe.
:D
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

Antworten