claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 10/2003

Textdateien durchsuchen mit grep

Textfischer

von Elisabeth Bauer


Nach den literarischen Schätzen, im Sammlerwahn aus dem Internet gezogen, die heute auf mancher Festplatte schlummern, hätte sich manch mittelalterlicher Gelehrter alle zehn Finger geleckt. Doch wie in der digitalen Datensammlung Textstellen wiederfinden? Das Shell-Kommando grep hilft bei der Jagd nach Zitaten.

"Was man nicht im Kopf hat, muss man im Computer haben" ist eigentlich ein schönes Prinzip. Doch im Gegensatz zum menschlichen Gedächtnis, das -- außer in der Abschlussprüfung -- das gespeicherte Wissen meist zuverlässig parat hat, lassen sich Informationen auf der Festplatte oft nicht so einfach wiederfinden. Hat man Dateinamen und Speicherort vergessen, vergeht schnell viel Zeit mit dem Durchsuchen von Verzeichnissen, und selbst wenn man genau weiß, in welcher Datei die gesuchte Information steckt, nutzt das bei langen Textdateien herzlich wenig.

In beiden Fällen hilft das Shell-Kommando grep, das in Texten nach angegebenen Mustern sucht. Im einfachsten Fall ruft man grep mit dem Suchbegriff und der Datei auf, in der er suchen soll. Grep gibt alle Zeilen der angegebenen Datei aus, die den Begriff enthalten.

Um beispielsweise in der in Textform gespeicherten Luther-Bibel nach allen Vorkommen des Garten Eden zu suchen, tippt man

grep Eden bibel.txt

in die Shell, und grep wirft alle gefundenen Bibelstellen aus. Enthält der Suchbegriff Leerzeichen, muss man ihn in Anführungszeichen setzen. Bei den Sonderzeichen lauert eine kleine Tücke: Die Zeichen *, ? und ! haben für die Shell eine besondere Bedeutung. Eine weitere Gruppe (., *, ^, $ und \) hingegen wird von Grep nicht als normale Zeichen, sondern als so genannte reguläre Ausdrücke verstanden (siehe Kasten Seite ##). Damit lassen sich sehr mächtige und komplexe Suchabfragen konstruieren, doch für die ersten Schritte mit Grep verzichtet man besser ganz darauf, diese Zeichen in Suchbegriffen zu verwenden.

Wenn man nicht mehr weiß, in welcher Datei die gesuchte Stelle steht, ruft man grep mit einer Wildcard (*) auf. Die vom Projekt Gutenberg gespeicherte Version von Nietzsches "Also sprach Zarathustra" besteht aus vielen einzelnen HTML-Dateien.

grep Weisheit *.htm

zeigt alle Vorkommen des Worts Weisheit in Nietzsches philosophischem Hauptwerk an (siehe Abbildung 1). Das Sternchen steht für beliebige Buchstaben, die Shell ersetzt den letzten Ausdruck also durch alle Dateinamen im aktuellen Verzeichnis, die auf .htm enden.

Abb. 1: Nietzsches "Also sprach Zarathustra" ist in viele HTML-Dateien aufgeteilt. Mit der Wildcard "*.htm" durchsucht grep alle Dateien im Verzeichnis.

Sind die Dateien, die man durchsuchen will, auf mehrere Verzeichnisse verteilt, kann man grep mit der Option -r anweisen, einen Ordner rekursiv zu durchforsten:

grep -r Weisheit nietzsche/werke/

sucht im Ordner werke und allen Unterverzeichnissen nach der Weisheit.

Das Trio ps, grep und kill

Praktisch ist grep jedoch nicht nur für philosophische oder theologische Textrecherchen, sondern auch im Zusammenspiel mit anderen Shell-Kommandos. Wenn ein Kommando viel Text ausgibt, lässt sich mit dem Pipe-Zeichen (|) und darauf folgendem grep suchbegriff die Ausgabe auf die relevanten Teile reduzieren. Ein klassischer Anwendungsfall ist der Abschuss eines nicht mehr reagierenden Programms von der Shell aus:

Das Kommando ps ax listet alle Prozesse auf; diese Liste reicht man mit dem Pipe-Zeichen an grep weiter und filtert das gesuchte Programm aus. Eine Suche nach Mozilla ergibt beispielsweise Folgendes:

> ps ax | grep mozilla
2500 ?        S      1:40 /usr/lib/mozilla-1.3/mozilla-bin
5645 pts/4    S      0:00 grep mozilla

Grep liefert gleich zwei Treffer mit Mozilla im Namen -- nicht nur den laufenden Browser, sondern auch sich selbst. Am Beginn jeder Zeile steht der interessante Teil: die Prozess-ID, anhand der man Programme mit dem Kommando kill von der Shell aus beenden kann. Nun kann man den hängenden Mozilla durch die Eingabe von kill 2500 beenden.

Als notorisch tippfauler Shell-Guru verspürt man natürlich wenig Lust, dieses Kommando, das man doch häufiger braucht, jedesmal komplett einzugeben: Kurzum, ein alias muss her. Alias-Definitionen speichert man am besten in der Datei .bashrc im Home-Verzeichnis, die bei jedem Start einer interaktiven Shell ausgeführt wird. Öffnen Sie die Datei in einem Text-Editor, je nach Vorliebe grafisch mit kwrite ~/.bashrc & oder auf der Shell mit vi ~/.bashrc. Für den nicht unkomplizierten vi geben wir hier wieder eine Kurzanleitung: Mit der Eingabe von G springt vi ans Ende der Datei, mit o schalten Sie den Editor in den Eingabe-Modus -- im Gegensatz zu den Befehlen a und i beginnt vi gleich eine neue Zeile und setzt den Cursor dorthin.

In die letzte Zeile der .bashrc tragen Sie nun das Alias ein. Anstelle von pss kann jeder Name stehen, den Sie sich leicht merken können -- nur ein existierendes Kommando sollte nicht genauso heißen:

alias pss="ps ax | grep"

Das war's auch schon: Mit [Esc] ZZ oder [Escape] :wq sichern Sie die Datei und beenden vi. Damit man das frisch gesetzte Alias gleich verwenden kann, muss in der schon geöffneten Shell die Konfigurationsdatei neu eingelesen werden. Geben Sie dazu:

. ~/.bashrc

ein. Ab sofort kann man nun mit pss programm nach laufenden Programmen suchen.

Adressbuch für Puristen

Grep lässt sich enorm vielseitig einsetzen. Meine persönliche Lieblingsanwendung von Grep ist jedoch ein schlichtes Adressbuch.

Als Zutaten braucht man dazu nur die Befehle grep, alias und cat sowie eine Textdatei, in der man jeweils in eigene Zeilen Namen, Telefon, E-Mail-Adresse und Adresse seiner Freunde, Bekannten und Anverwandten einträgt; ein Adresseintrag könnte beispielsweise so aussehen:

Kalle Pinguin
+67211 111
tux@linux.org
Südpolstraße 1
Tuxhausen, Antarktis

Die Datei speichert man als adressbuch im Home-Verzeichnis. In die Datei .bashrc trägt man nun folgendes Alias ein:

alias tel="cat ~/adressbuch | grep -i -A 4"

Der Befehl cat gibt die Datei adressbuch aus. Mit dem Pipe-Zeichen (|) schicken Sie diese Ausgabe an grep weiter. Die Option -i ("case-insensitive") sorgt dafür, dass bei der Suche auf Groß- und Kleinschreibung nicht geachtet wird. -A 4 schließlich weist grep an, zur gefundenen Zeile noch vier Folgezeilen auszugeben.

Mit

. ~/.bashrc

wird die Konfigurationsdatei neu gelesen. In Zukunft genügt die Eingabe tel name in der Shell, um vom Gesuchten die Adresse zu erhalten -- schneller geht's nicht! (eba)

Abb. 2: Mit grep ist ein Adressbuch für die Shell schnell selbst gebaut. Das Alias "tel" gibt den passenden Adresseintrag aus.
Grep in Kürze
  • grep muster datei sucht in datei nach muster
  • grep muster *.htm sucht in allen Dateien des aktuellen Verzeichnisses, die mit .htm enden
  • grep -r muster ordner sucht rekursiv in ordner und allen Unterverzeichnissen
  • grep -i muster datei kümmert sich nicht um Groß- und Kleinschreibung
  • grep -A n gibt n Folgezeilen nach der gefundenen Stelle aus

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2017 COMPUTEC MEDIA GmbH | Last modified: 2007-01-25 16:30

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]