[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

*Seufz* ;) Re: "grep -A 10 -v" welches grep bearbeitet -A n vor -v? Gibt es irgendwo ein hack oder patch?



Salve Frank!

On Mon, 03 Jul 2006, Frank Küster wrote:

> Robert Michel <news@robertmichel.de> wrote:
> 
> > Natürlich geht es nicht mit dem orginalen grep - das ärgert mich ja,
> > schaut man sich aber "echo -e 'a\nb\nb\nc\nd' |grep -A 1 b"
> > an, so kann grep sehrwohl sich "Zusätzliche Zeilen merken"
> >
> >
> > echo Zeile1; Muster?  nein -> $ZusätzlicheZeilen > 0 ?  Nein >  echo ""
> > echo Zeile2; Muster?  ja -> ZusätzlicheZeilen=1;  echo "Zeile2"
> > echo Zeile3; Muster?  ja -> ZusätzlicheZeilen=1;  echo "Zeile3"
> > echo Zeile4; Muster?  nein -> $ZusätzlicheZeilen >9 ? Ja > 
> >      ZusätzlicheZeilen=$ZusätzlicheZeilen-1; echo "Zeile4"
> > echo Zeile5; Muster?  nein -> $ZusätzlicheZeilen > 0 ?  Nein >  echo ""
> >
> > Nur der allerletzte Schritt mus invertiert werden.  
> 
> Ich glaube, du hast da einige Missverständnisse bezüglich dessen was
> grep macht.  Erstens hat es natürlich nichts mit "echo" zu tun; aber ich
> denke das weißt du auch und hast es nur als Symbol für "analysiere"
> (erstes Auftreten) bzw. "gebe aus" (zweites Auftreten) verwendet.

Es war auf die schnelle vor der Mensa der versuch aufzuzeigen,
das "grep -A 2 Muster" nicht stur Zeilenweise arbeitet, 

       -A NUM, --after-context=NUM
                     Zeige NUM Zeilen Kontext im Anschluss  an  eine
		     auf  das  Muster passende Zeile an.
		     
> Zweitens der Begriff des "invertierens" - ich habe den in diesem
> Zusammenhang noch nie gehört.  Falls du damit die Wirkung der Option -v
> meinst:  Das bewirkt *nicht*, dass erst im Ausgabeteil eine Entscheidung
> andersherum getroffen wird, als "nicht ausgeben" statt "ausgeben".

Genau das ist ja die Krux

	       -v, --invert-match
	             Invertiert das Suchmuster, so dass alle
		     Zeilen ausgewählt werden, die nicht auf MUSTER passen

mir ist schon klar das die Option  "-v" nicht die Ausgabe von "grep -A 2"
invertiert....
					   

> Vielmehr bewirkt es, dass die Bedeutung des Musters verneint wird.  In
> deinem zweischrittigen Algorithmus oben wirkt es also nur im Abschnitt
> "Muster?".  Erst wenn das erledigt ist, wird entschieden, ob nur die
> gewählte Zeile ausgegeben wird oder noch welche danach oder davor.

So primitiv ist grep intern nicht:

#echo -e 'a\nb\nb\nc\nd' |grep -A 1 -B 1 -e b -e c
a
b
c
d
#
und nicht
a
b
c
b
c
d

;)




> 
> > grep -A 10 -B 10 kann das sogar nach vorn und zurück.....
> 
> Und drittens, aber das hängt damit zusammen, arbeitet grep eben keine
> Programme ab und merkt sich daher auch nichts über "alte" Zeilen.  Es
> arbeitet stur zeilenweise, überprüft, welche Zeilen auf das Muster
> zutreffen, und schaut dann nach, ob es diese ausgeben soll, oder die
> anderen, oder noch welche in der Nachbarschaft.

#echo -e 'a\nb\nb\nc\nd' |grep -A 1 -B 1 -e b -e c
a
b
c
d
#

> Du hast aber eine Anforderung beschrieben, die nicht machbar ist, ohne
> Informationen über vorhergehende Zeilen zu speichern.  Und das macht
> grep nicht.

#echo -e 'a\nb\nb\nc\nd' |grep -A 1 -B 1 
;)
 
> > Also es würde gehen - nur mit dem dummen grep nicht.
> 
> Natürlich geht es, und es gibt auch tools die das können.  Aber grep ist
> kein solches tool, weil es nur Muster kann, aber keine Algorithmen.  Und
> das liegt warscheinlich auch nicht daran, dass niemand bereit war, das
> zu implementieren, sondern weil es in grep nichts zu tun hat.

Betriebsblindheit? 

Klar kann man argumentieren, das -v nur Match invertiert und das nur
die Muster, nicht jedoch Zeilen im Kontext zum Match gehören.

> sondern weil es in grep nichts zu tun hat.

Wieso soll ich als User awk-Algorithmen lernen wenn es um ein simples
umkehren der Ausgabe von "grep -A 2 Muster" geht.

Ich hätte mich auf dieser Liste nicht auf Diskussionen einlassen sollen
warum - ich finde es fehlt dem orginalen grep dieses Feature und wenn
man googlet findet man tausende Stellen bei dennen dann hingewiesen
wird: nimm doch sed oder awk....
nix gegen diese Tools, aber dann könnte man auch gleich grep,
tail,head,wc... in die tonne kloppen...

Ich wollte einfach nur wissen, ob jemand einen Fork von grep kennt.
Danke. 

Genießt den Sommer :)
rob

PS: (Suchen nach "grep patch" oder ähnlichem ist auch nicht 
hilfreich/erhellend da grep häufig in zusammenhang von Dateien und auch 
patches verwendet wird)



Reply to: