grep

Wir haben grep schon einige Male verwendet um nach einer Wortkette in Textdateien zu suchen.

Man kann den Befehl auf 2 Arten verwenden:

grep suchmuster file1.txt file2.txt file3.txt

würde "suchmuster" in den 3 Files file1.txt bis file3.txt suchen.
Oder man verwendet ihn als Filter:

cat blabla.txt | grep suchmuster

würde das Suchmuster in der Ausgabe von "cat blabla.txt" oder der
Ausgabe jedes anderen Programms suchen.. (z.B. locate, find, fortune, zcat oder was auch immer...)

Suchmuster kann entweder eine einfache Zeichenkette sein, z.B.:

grep bla *.txt

oder eine sogenannte "regular expression":
eine regular expression ist z.B.

grep "[Bb]l*[ioa]" *.txt

das würde in allen Dateien mit der Endung .txt, die im aktuellen Verzeichnis liegen die Zeilen suchen, in denen blla bllllli Blo oder ähnliches steht.. (mit einem grossen oder kleinen B beginnen) dann beliebig viele l (auch 0) und danach entweder ein i oder ein o oder ein a haben.

Die Zeichen in [] heißt eines von denen. Das * heißt vom vorigen Zeichen 0 oder mehrere Vorkomnisse des Zeichens davor.

grep "ab*c" würde ac abc abbbc abbbbbbbbc etc.. finden.. nicht aber abba

grep "a[bcd]e" würde abe ace ade finden.

grep "a[^efg]c" würde alle Vorkommisse von a?c finden wobei ? ein beliebiger Buchstabe außer e oder f oder g wäre...

(das ^ im [ ] heißt alle Buchstaben, bis auf die Angegebenen..)

grep "a.b" würde nach allen a?b suchen. der Punkt . heisst: ein beliebiges Zeichen.

Wenn du nach Zeichen suchen willst, die in grep eine spezielle Bedeutung haben, dann musst diese "escapen": d.h. mit einem \ schreiben.

grep \".*\" *.txt würde alle Zeilen suchen, die einen Text in Anführungszeichen enthalten..

grep "\]" würde alle Zeilen suchen die ein ] enthalten.

grep " [a-z][0-9][0-9]* "

würde alle Stellen finden, wo ein Wort (hinten und vorne Leerzeichen) ist, dass mit den Buchstaben a-z beginned und dann eine Zahl mit mindesten
einer oder mehr Stellen hat..

Es gibt dann noch grep -E (oder auch egrep, was dasselbe ist); mit dem kannst dann noch kompliziertere Suchmuster bauen:

egrep "a{3,5}b" würde alle Stellen finden, in denen 3 bis 5 a's von eimem b gefolgt werden...

aber das braucht man kaum.

Hier noch ein paar andere NÜTZLICHE Switches von grep:

-i .... ignore case. Gross- und Kleinschreibung ist egal
-5 (oder eine andere zahl) bei der Ausgabe werden 5 Zeilen vor und 5 Zeilen
nach der gefunden Stelle ausgegeben.
-c gibt die Zeilen nicht aus sondern nur wie oft der Suchbegriff vorkommt
-n gibt auch immer die Zeilennummer an, wo der Suchstring vorkommt.

und dann gibt es noch:

zgrep blabla *.gz

würde den Text blabla in den .gz Files suchen aber diese vor dem Suchen zuerst auspacken.. ist praktisch wenn man in den Hilfetexten sucht:

zgrep printing /usr/share/doc/HOWTO/en-txt/*.gz

würde überall in den HOWTO Dokumneten nach dem Wort "printing" suchen. (vorausgesetzt diese howto Files liegen in diesem Verzeichnis. Das ist aber bei allen Distributionen unterschiedlich. Aber mit locate kannst du ja suchen, wo die Howtos bei dir liegen.


EXERCISES:

Such dir ein Verzeichnis mit möglichst vielen Textdateien und verwende grep um nach interessanten Wörtern zu suchen.

REFERENCES:

man grep
grep --help