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:
-
-v
Löscht alle Zeilen, die mit dem regulären Ausdruck übereinstimmen: grep -v 'regex'. -
-c / --count
Dieser Parameter zeigt die gefilterten Zeilen nicht an, sondern zählt sie. Wenn er zusammen mit -v verwendet wird, werden die Zeilen gezählt, die dem Ausdruck nicht entsprechen.
user$ ls | grep -c '^kap..\.tex' 15
Listing 6.6 Wie viele Dateien sind es denn?
-
-n / --line-number
Dieser Parameter gibt die Zeilennummer für die gefundenen Zeilen aus.
user$ grep -n Shellskript kap09.tex 37:
gpAbschnitt{Grundlagen der Shellskript-Programmierung} 41:Programmierung von Shellskripten ist in der Linux-Welt ein 44:Zunächst werden wir uns mit den grundlegenden Dingen der ...Listing 6.7 Zeilenzahl
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