Aus LinuxUser 05/2004

Zu Befehl: Suchen mit grep, egrep, fgrep, (b)zgrep

© Jim Ernsberger

Stecknadel im Heuhaufen

Für die Suche nach Wörtern und Ausdrücken in Textdateien bieten sich die Kommandos der grep-Familie an. Als Ergebnis zeigen sie wahlweise die gefundenen Zeilen, die Namen der Dateien, in denen das Suchmuster vorkommt, oder die Anzahl der Treffer an.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Vergessen, welche Datei die nützlichen Hinweise zu Programm xy enthielt, die sie vor geraumer Zeit einmal notierten? Dann helfen die Kommandos der grep-Familie weiter. Der Befehl grep (kurz für „global regular expression print/parser“) durchsucht Textdateien nach Suchmustern und gibt als Ergebnis die Zeilen am Bildschirm aus, die einen Treffer enthalten.

Als Suchmuster versteht das Kommando nicht nur einfache Textausschnitte, sondern auch reguläre Ausdrücke, mit denen sich die legendäre Stecknadel im Heuhaufen finden lässt.

Im einfachsten Fall durchforstet grep die angegebene(n) Datei(en) (im folgenden Beispiel grep.html) nach einem einfachen Wort und und gibt die Zeilen auf dem Bildschirm aus, die es enthalten:

huhn@asteroid:~$ grep Der grep.html
Der Befehl grep (global regular expression …
suchmuster datei(en). Der Befehl durchfors …

Standardmäßig unterscheidet der Befehl bei den Suchbegriffen zwischen Groß- und Kleinschreibung. Abschalten lässt sich dieses Verhalten mit dem Parameter -i. Da grep jetzt allerdings auch Wörter findet, die „der“ als Teilwort enthalten, z. B. „oder“, fordern Sie einfach zusätzlich mit -w, dass das Kommando nur nach ganzen Wörtern sucht:

huhn@asteroid:~$ grep -iw der grep.htmlDer Befehl grep (global regular expression …
suchmuster datei(en). Der Befehl durchfors …
auch die Zeilen sehen möchte, in denen "der" …

Ein bisschen mehr erfahren Sie, wenn Sie den Parameter -n verwenden – dann zeigt grep auch die Zeilennummer an:

huhn@asteroid:~$ grep -n "Das" grep.html
109:Das ^-Zeichen markiert den Zeilenanfang – …
112:Sonderzeichen nicht interpretiert. Das Zeil…

Bei der Suche nach Einzelwörtern sind die Gänsefüsschen freiwillig; sie müssen dastehen, wenn das Suchmuster z. B. Leerzeichen enthält.

Um die gefundenen Zeilen besser ins Gesamtbild einzuordnen, bietet grep die Option -num, wobei num die Anzahl der Zeilen ist, die Sie zusätzlich vor und nach der Trefferzeile sehen möchten. grep -10 "Das" grep.html fängt mit der Ausgabe zehn Zeilen vor der Fundstelle an und endet zehn Zeilen danach.

Zu viele Informationen auf einmal? Lassen Sie sich mit grep -c einfach nur die Anzahl der gefundenen Zeilen nennen. Wer lediglich wissen möchte, wie die Datei heißt, die das Suchmuster enthält, erfährt dies mit dem Parameter -l:

huhn@asteroid:~$ grep -l Befehl *.html
grep.html
zubefehl.html

Das Beispiel durchsucht alle auf .html endenden Dateien im aktuellen Verzeichnis. Wollen Sie ganze Verzeichnishierarchien durchforsten, nutzen Sie den zusätzlichen Parameter -r (für rekursiv):

huhn@asteroid:~/linux-user$ grep -r Kommandozeile *
01_2004/zubefehl/df_du.html:behalten. Wir zeigen, wie Sie auf der Kommandozeile
01_2004/zubefehl/df_du.html:Dateisystem etwas "überläuft". Linux bietet
11_2003/MagicPoint/magicpoint.html:MagicPoint einige Kommandozeilenoptionen
[…]

Manchmal ist es sinnvoll, einzelne Ergebnisse aus der Suchliste wieder zu streichen, z. B., wenn man Log-Dateien durchforstet und bestimmte Informationen einfach ausblenden möchte. Dazu eignet sich die Option -v, die grep anweist: „Suche nach allen Zeilen, die das Suchmuster nicht enthalten!“. Die mit

huhn@asteroid:~$ grep huhn /var/log/auth.log | grep -v pam
Mar 18 12:53:21 asteroid sshd[1965]: Accepted password for huhn from 192.168.2.15 port 1034 ssh2
Mar 18 12:57:06 asteroid sshd[2025]: Accepted password for huhn from 192.168.2.15 port 1035 ssh2
Mar 18 13:00:13 asteroid sudo:     huhn : TTY=pts/0 ; PWD=/home/huhn ; USER=root ; COMMAND=/bin/bash

durchsuchte Datei /var/log/auth.log protokolliert alle Einträge, die mit Authentifizierung zu tun haben. Viele Programme, z. B. login und sshd, benutzen PAM (Pluggable Authentication Modules), um den Benutzer zu authentifizieren (mehr dazu in /etc/pam.d). Im Beispiel sucht grep nach allen Zeilen, die den Namen des Users huhn enthalten, und wirft anschließend aus den Ergebnissen mit grep -v pam alle pam-Einträge wieder raus.

Tabelle 1: Reguläre Ausdrücke

Suchmuster Bedeutung
abc Genau diese Zeichenkette: „abc“
[abc] Eines dieser Zeichen: „a“, „b“ oder „c“
[^abc] Keines der Zeichen darf auftauchen
[a-c] Eines der Zeichen von „a“ bis „c“
. Ein beliebiges Zeichen
? Das Zeichen vor dem „?“ darf einmal oder gar nicht auftreten (nur egrep)
* Das Zeichen davor darf beliebig oft oder gar nicht auftreten
+ Das Zeichen davor darf beliebig oft, muss aber mindestens einmal auftreten (nur egrep)
| Verknüpfung zweier Suchmuster, nach denen alternativ gesucht wird (nur egrep)
{n} Das Zeichen zuvor muss genau n-mal auftreten
{,n} Das vorangehende Zeichen darf höchstens n-mal auftreten
{n,} Das vorangestellte Zeichen muss mindestens n-mal auftreten
{n,m} Das Zeichen zuvor muss mindestens n-mal und höchstens m-mal auftreten

Noch genauer bitte!

Wer genau weiß, dass der gesuchte Text irgendwo am Zeilenanfang einer Datei versteckt ist, gibt das als regulären Ausdruck bei der Suche mit an:

LinuxUser 05/2004 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

1 Kommentar auf "Zu Befehl: Suchen mit grep, egrep, fgrep, (b)zgrep"

  E-Mail Benachrichtigung  
Neuste Älteste Beste Bewertung
Benachrichtige mich zu:

Zitat aus Glossar:
Eine Möglichkeit, Suchanfragen mit Spielraum der Art „alle Zeilen, die mit A oder B beginnen und auf g enden“ zu formulieren. Als „Regular Expression“, kurz: Regexp, sieht diese Beispiel so aus: „^AB,*g$“;

Die Regex hier ist Mist. Richtig wäre „^(A|B).*g$“.