6.2    grep

grep ist eines der meistgenutzten Programme auf der Shell. Es wurde ursprünglich von Ken Thompson entwickelt, der es zunächst s (für das englische Wort search) nannte. Es wird dazu verwendet, bestimmte Zeilen aus ASCII-Streams herauszufiltern, womit gemeint ist, dass sie entweder unterdrückt oder nur angezeigt werden. Das Programm kann die bereits erwähnten regulären Ausdrücke (etwa . für ein beliebiges Zeichen) direkt verwenden. Das folgende Beispiel zeigt, wie Sie mit grep alle Dateien finden, die mit »kap« beginnen, dann zwei beliebige Zeichen enthalten und auf ».tex« enden. Dabei wird die Ausgabe aus der Pipe des ls-Kommandos herausgefiltert. Wir verwenden den Backslash (\) vor dem Punkt, damit dieser nicht als regulärer Ausdruck, sondern schlicht als regulärer Punkt interpretiert wird.

user$ ls | grep 'kap..\.tex'
kap01.tex
kap02.tex
kap03.tex
kap04.tex
…

Listing 6.3     Verwendung von grep

Analog könnten wir auch alle Nachrichten aus der Datei /var/log/syslog herausfiltern, die am 22. November zwischen 16:00:00 und 16:59:59 geloggt wurden:

user$ grep 'Nov 22 16:..:.. ' /var/log/syslog
Nov 22 16:30:13 eygo /bsd: fupids: user 1000: …
Nov 22 16:34:17 eygo /bsd: fupids: new programm …
…

Listing 6.4     Zeitbereiche filtern

Die in obiger Tabelle erwähnten Zahlenbereiche können ebenfalls mit regulären Ausdrücken gesucht werden. Dies funktioniert übrigens auch bei Programmen wie ls. Im folgenden Beispiel filtern wir alle Dateien, die mit »kap« beginnen, dann eine »0« oder eine »1«, anschließend eine Zahl zwischen »0« und »9« im Namen tragen und auf ».tex« enden. Im ersten Beispiel filtern wir direkt bei ls, im zweiten Beispiel bei grep. Der Befehl wc -l zählt uns zum Vergleich schlicht die Anzahl der ausgegebenen Zeilen.

user$ ls kap[01][0-9].tex | wc -l
15
user$ ls | grep 'kap[01][0-9]\.tex' | wc -l
15

Listing 6.5     Zahlenbereiche filtern

6.2.1    Aufrufparameter für grep

Der Parameteraufruf für grep bietet eine Menge nützlicher Befehle. Die wichtigsten und meistgenutzten sind:

6.2.2    grep -E und egrep

Sehr hilfreich ist die Fähigkeit, mehrere Ausdrücke in einem Befehl zu filtern. Dabei verwendet man ein logisches ODER in Form eines Pipe-Zeichens zwischen den Ausdrücken sowie entweder grep mit der Option -E oder das Programm egrep.

$ egrep -v 'n$|k$' Standorte
Augsburg
Bernburg
Halle
Krumbach
$ grep -vE 'n$|k$' Standorte
Augsburg
Bernburg
Halle
Krumbach

Listing 6.8     egrep

Ein Blick in die Manpage verrät uns das Geheimnis: egrep ist mit einem Aufruf von grep -E gleichzusetzen. Zudem findet man im Dateisystem, zumindest unter Slackware-Linux, den symbolischen Link /bin/egrep auf /bin/grep. Dies bedeutet, dass das Programm grep intern abfragt, ob der Programmname egrep oder nur grep lautet, und sein Verhalten der Option -E im Falle von egrep automatisch anpasst.

6.2.3    Exkurs: PDF-Files mit grep durchsuchen

Es ist möglich, mithilfe der poppler-utils (auch poppler-tools genannt), den Inhalt von PDF-Dateien in Textform auszugeben. Diese Textform kann dann wiederum mit Programmen wie grep durchsucht werden. Die poppler-utils stellen dazu das Programm pdftotext bereit. Übergeben wird dem Programm dabei zunächst ein Dateiname und als zweiter Parameter die Ausgabedatei oder ein »-«, um zu signalisieren, dass der Inhalt der Datei auf die Standardausgabe geschrieben werden soll.

$ pdftotext CovertChannels.pdf - | grep portknocker
keywords : covert, channels, ... portknocker
It seems obvious that t... portknocker or ...
...

Listing 6.9     Eine PDF-Datei durchsuchen (Ausgabe gekürzt)

Die poppler-utils enthalten übrigens auch einige weitere Programme wie etwa pdftohtml, mit dem der Inhalt von PDF-Dateien in HTML umgewandelt werden kann. Mit pdftops lassen sich die Dateien hingegen ins PostScript-Format konvertieren.

$ pdftohtml essay.pdf essay.html
Page-1
Page-2
...

Listing 6.10     Eine PDF-Datei in HTML konvertieren