88042_8721.jpg

© Jim Ernsberger

Stecknadel im Heuhaufen

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

01.05.2004
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:

huhn@asteroid:~$ grep "^Der" grep.html
Der Befehl grep (get regular expression…

Das ^-Zeichen markiert den Zeilenanfang – beachten Sie, dass entweder ein Backslash (\) vor dem Meta-Zeichen stehen oder das gesamte Suchmuster in doppelte Anführungszeichen eingeschlossen werden muss, damit die Shell das Sonderzeichen nicht als für sich gedacht vorab interpretiert. Nach dem Zeilenende suchen Sie mit dem Dollarzeichen:

huhn@asteroid:~$ grep "und$" grep.html
expression) durchsucht Textdateien nach Suchmustern und
grep arbeitet "case sensitive", d. h. unterscheidet Groß-

Die beiden Zeichen ^ und $ lassen sich auch kombinieren: Setzen Sie einfach einen beliebigen Text dazwischen, sucht grep nach genau dieser Zeile. Wer statt ganzen Zeilen lieber einzelne Begriffe definiert, begrenzt Wörter mit \< und \>.

Andere reguläre Ausdrücke funktionierne nur zusammen mit egrep bzw. grep -E (Tabelle 1). egrep steht für "extended grep" ("erweitertes grep"). Sucht man beispielsweise in einem Text nach den Wörtern "Petronella" und "Petrosilie", geht das mit egrep ganz einfach so:

egrep "Petro(nella|silie)" datei.txt

Etwas Vorsicht vor der Interpretationslust der Shell ist bei den Ausdrücken in geschweiften Klammern aus Tabelle 1 geboten: Einfach nur in Gänsefüßchen setzen, hilft hier nicht; um alle Zeilen mit drei "m"s hintereinander zu finden, muss man

grep "m\{3\}" datei

schreiben.

Andere Familienmitglieder

Zur grep-Familie gehören noch weitere Kommandos. Der Befehl fgrep (alternativ grep -F) verwendet einen schnelleren Suchalgorithmus, erlaubt aber keine regulären Ausdrücke als Suchmuster. Das Kommando empfiehlt sich immer dann, wenn besonders schnell große Datenmengen durchsucht werden sollen.

Geht es hingegen um komprimierte Dateien, helfen zgrep und bzgrep weiter: Mit gzip gepackte Dateien durchsuchen Sie mit zgrep, mit bzip2 Komprimiertes entsprechend mit bzgrep:

bzgrep Petronella datei.txt.bz2

Das erspart umständliches Entpacken und Neukomprimieren vor und nach der Suche.

Glossar

reguläre Ausdrücke

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 darin verwendeten Zeichen erklärt Tabelle 1. Weitere Informationen geben [1] und http://de.wikipedia.org/wiki/Reguläre_Ausdrücke.

Infos

[1] Reguläre Ausdrücke: Marc André Selig, "Nadel im Heuhaufen", LinuxUser 08/2002, S. 74 ff.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • 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, wo es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
  • Suche in komprimierten Dateien und Archiven
    Über die Kommandozeile flink in komprimierten Dateien und Archiven zu suchen, spart viel Zeit. Die richtigen Tools dazu bringt praktisch jedes Linux-System von Haus aus mit.
  • Zu Befehl: date & cal
    Die Kommandozeilen-Tools cal und date erzeugen Kalender und bearbeiten Datum und Uhrzeit. Wenn man sie geschickt einsetzt, kann man daraus zum Beispiel eine kleine Geburtstagsverwaltung machen.
  • Zu Befehl: Kanäle, Pipes und Tee
    Mit wenigen Handgriffen leiten Sie auf der Kommandozeile Ein- und Ausgaben von Befehlen um und kombinieren Kommandos. Wir stellen die benötigten Bash-Operatoren vor und zeigen, wie Sie mit dem Programm tee noch einen Zwischenschritt einlegen.
  • sed
    Der Stream-Editor sed hilft beim automatischen Verändern einer oder mehrerer Dateien, vereinfacht sich wiederholende Änderungen oder erstellt gleich ganze Konvertierungsprogramme. Monotone Aufgaben der Textverarbeitung lassen sich so im Handumdrehen lösen.
Kommentare

Infos zur Publikation

title_2014_10

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...