GREP(1)

BEZEICHNUNG
grep, egrep, fgrep - finde Suchmuster in Dateien

Diese Handbuchseite ist eventuell veraltet. Im Zweifelsfall ziehen Sie die englischsprachige Handbuchseite zu Rate, indem Sie

    man -LC 1 grep

eingeben.

ÜBERSICHT
grep [Optionen] MUSTER [DATEI...]
grep [Optionen] [-e MUSTER | -f DATEI] [DATEI...]

BESCHREIBUNG

Grep sucht in den angegebenen DATEIen nach Zeilen, die auf das MUSTER passen. Sind keine Dateien oder der spezielle Dateiname - angegeben, so liest grep statt dessen von der Standardeingabe. Sofern nicht anders spezifiziert, gibt es genau die Zeilen aus, die auf MUSTER passen.

Es existieren noch die beiden Programmvarianten egrep und fgrep. Sie verhalten sich identisch zum normalen grep, das mit der Option -E beziehungsweise -F aufgerufen wurde.

OPTIONEN

-A NUM, --after-context=NUM
    Zeige NUM Zeilen Kontext im Anschluss an eine auf das Muster passende Zeile an.

-a, --text
    Verarbeite eine Binärdatei als wäre sie gewöhnlicher Text; dieser Schalter bedeutet dasselbe wie die Option --binary-files=text.

-B NUM, --before-context=NUM
    Zeige NUM Zeilen Kontext vor einer auf das Muster passenden Zeile an.

-C [NUM], -NUM, --context[=NUM]
    Zeige je NUM Zeilen Kontext vor und nach einer auf das Muster passenden Zeile an. Zwei Zeilen Kontext sind voreingestellt.

-b, --byte-offset
    Zeige vor jeder Ausgabezeile den Abstand in Bytes innerhalb der Eingabedatei an.

--binary-files=TYP
    Falls die ersten Bytes einer Datei anzeigen, dass sie Binärdaten enthält, soll angenommen werden, dass es sich um eine Datei vom Typ TYP handelt. Mögliche Typen sind binary, text und without-match. In der Einstellung binary zeigt grep auf das Muster passende Zeilen nicht direkt an, sondern gibt lediglich eine Meldung aus, dass in der Datei Treffer gefunden wurden. Dieses Verhalten ist voreingestellt. In der Einstellung without-match überspringt grep Binärdateien, ohne dort nach Treffern zu suchen. Der Schalter -I bewirkt dasselbe. Vorsicht ist mit der Einstellung text geboten, da grep hier die passenden Zeilen direkt anzeigt. Das kann Probleme bereiten, wenn die Ausgabe auf eine Konsole geleitet wird und deren Treiber manche der Binärdaten als Steuerzeichen interpretiert. Dieser Modus kann auch über den Schalter -a eingestellt werden.

-c, --count
    Statt die passenden Zeilen direkt anzuzeigen, wird lediglich ihre Anzahl pro Eingabedatei ausgegeben. Ist zusätzlich die Option -v, --invert-match (siehe unten) angegeben, zählt grep die Zeilen ohne Treffer zusammen.

-d AKTION, --directories=AKTION
    Handelt es sich bei einer der Eingabedateien um ein Verzeichnis, so soll die Aktion AKTION ausgeführt werden, um es zu verarbeiten. In der Standardeinstellung read liest grep das Verzeichnis ein, als wäre es eine gewöhnliche Datei. Ist AKTION auf skip gesetzt, so werden Verzeichnis stillschweigend übersprungen. Steht AKTION auf recurse oder wurde der Schalter -r benutzt, so sucht grep rekursiv durch sämtliche Dateien unterhalb jedes Verzeichnisses.

-E, --extended-regexp
    MUSTER soll als erweiterter regulärer Ausdruck (siehe unten) interpretiert werden.

-e MUSTER, --regexp=MUSTER
    Verwende MUSTER als das Suchmuster. Dadurch lässt sich verhindern, dass grep Suchmuster, die mit - beginnen, als Optionen interpretiert.

-F, --fixed-strings
    Interpretiere MUSTER als Liste feststehender Zeichenketten, die durch Zeilenumbruch getrennt sind. Für einen Treffer muss mindestens eine der Zeichenketten passen.

-f DATEI, --file=DATEI
    Lies die Suchmuster Zeile für Zeile aus DATEI ein. Eine leere Datei enthält keinerlei Suchmuster und erzielt deshalb auch keine Treffer.

-G, --basic-regexp
    Interpretiere MUSTER als gewöhnlichen regulären Ausdruck (siehe unten). Dies entspricht der Voreinstellung.

-H, --with-filename
    Gibt vor jedem Treffer den zugehörigen Dateinamen aus.

-h, --no-filename
    Der Dateiname wird auch dann nicht vor einem Treffer ausgegeben, wenn mehrere Dateien durchsucht werden.

--help
    Zeigt eine kurze Hilfe zum Programm an.

-I  Behandelt Binärdateien so, als würde ihr Inhalt nie auf das Suchmuster passen. Dies ist gleichbedeutend mit der Option --binary-files=without-match.

-i, --ignore-case
    Unterscheidet auf der Suche nach Treffern nicht zwischen Groß- und Kleinschreibung.

-L, --files-without-match
    Statt der normalen Ausgabe wird der Name jeder Datei ohne Treffer angezeigt. Die Suche endet in jeder Datei beim ersten Treffer.

-l, --files-with-matches
    Statt der normalen Ausgabe wird der Name jeder Datei mit mindestens einem Treffer angezeigt. Die Suche endet in jeder Datei beim ersten Treffer.

--mmap
    Verwendet falls möglich den Systemaufruf mmap(2) statt des üblichen read(2), um die Eingabedaten einzulesen. Unter gewissen Umständen erzielt --mmap bessere Leistungswerte, ist jedoch unzuverlässiger und kann sogar zu Programmabstürzen führen, wenn beispielsweise eine Eingabedatei während der Suche verkleinert wird oder ein Ein-/Ausgabefehler auftritt.

-n, --line-number
    Gibt vor jeder Zeile die Zeilennummer innerhalb der aktuellen Eingabedatei aus.

-o, --only-matching
    Anstatt der gesamten Zeile wird nur der (nicht-leere) Teil ausgegeben, der einen Treffer hat. Jeder dieser Teile wird auf einer eigenen Zeile ausgegeben.

-q, --quiet, --silent
    Unterdrückt die normalen Ausgaben. Die Suche endet nach dem ersten Treffer. Diese Option ist sinnvoll, wenn lediglich der Rückgabewert von grep weiter verwendet wird. Siehe auch die Optionen -s und --no-messages weiter unten.

-r, --recursive
    Durchsuche rekursiv sämtliche Dateien unterhalb eines Verzeichnisses. Die Option -d recurse hat dieselbe Bedeutung.

-s, --no-messages
    Unterdrücke Fehlermeldungen über nicht vorhandene oder unlesbare Dateien. Anmerkung zur Portierbarkeit: Im Gegensatz zu GNU grep verhielt sich das ursprüngliche grep nicht konform zum POSIX.2-Standard, da es keine Option -q kannte und die Option -s sich so verhielt wie -q im heutigen GNU grep. Portable Shell-Skripte, die auch mit dem ursprünglichen grep funktionieren müssen, sollten deshalb weder -q noch -s verwenden und statt dessen die Ausgabe nach /dev/null umleiten.

-U, --binary
    Verarbeite die Eingaben als Binärdateien. Unter MS-DOS und MS-Windows versucht grep, den Dateityp zu bestimmen, indem es die ersten 32kByte der Datei untersucht. In einer Textdatei entfernt es daraufhin intern alle CR-Wagenrücklaufzeichen, damit ^ und $ in regulären Ausdrücken korrekt funktionieren. Die Angabe von -U umgeht die ganze Raterei und weist grep an, jede Datei exakt so zu verarbeiten, wie sie eingelesen worden ist. Falls es sich um eine Textdatei handelt, deren Zeilen mit einem kombinierten Wagenrücklauf und Zeilenumbruch (CR/LF) enden, arbeiten manche reguläre Ausdrücken fehlerhaft. Diese Option hat keine Auswirkungen auf anderen Plattformen als MS-DOS und MS-Windows.

-u, --unix-byte-offsets
    Zeigt Byte-Abstände im Unix-Stil an. Mit Hilfe dieses Schalters gibt grep Byte-Abstände in Textdateien stets so aus, als würden sie nur ein einzelnes Zeilenumbruchsymbol am Zeilenende enthalten. Mit anderen Worten: Ein eventuelles Wagenrücklaufsymbol am Zeilenende wird nicht berücksichtigt. So erzeugt grep, angewandt auf eine Textdatei im DOS-Format identische Resultate wie für die gleiche Textdatei im Unix-Format. Diese Option ist nur in Verbindung mit dem Schalter -b wirksam. Sie hat keine Auswirkungen auf anderen Plattformen als MS-DOS und MS-Windows.

-V, --version
    Zeigt die Versionsnummer von grep auf dem Standard-Fehlerausgabekanal an. Die Versionsnummer sollte in allen Fehlerberichten (siehe unten) mit angegeben werden.

-v, --invert-match
    Invertiert das Suchmuster, so dass alle Zeilen ausgewählt werden, die nicht auf MUSTER passen.

-w, --word-regexp
    Wählt nur solche Zeilen aus, deren Treffer aus kompletten Wörtern bestehen. Im einzelnen verläuft der Test so, dass eine passende Zeichenkette entweder am Zeilenanfang beginnen muss oder auf ein Zeichen folgt, das nicht zu den Wortaufbau-Zeichen gehört. Ebenso muss das Ende der Zeichenkette entweder mit dem Zeilenende zusammenfallen, oder es wird nicht gefolgt von einem der Wortaufbau-Zeichen. Wortaufbau-Zeichen sind alle Buchstaben, Ziffern sowie der Unterstrich.

-x, --line-regexp
    Wählt nur solche Zeilen aus, deren Treffer die komplette Zeile umfasst.

-y  Ein veraltetes Synonym für -i.

-Z, --null
    Gibt statt des üblichen Trennzeichens nach jedem Dateinamen ein Nullbyte (das ASCII-Zeichen NUL) aus. So stellt beispielsweise grep -lZ nach jedem Dateinamen statt des Zeilenumbruchs ein Nullbyte dar. Diese Option sorgt dafür, dass die Ausgabe selbst in Gegenwart ungewöhnlicher Dateinamen eindeutig bleibt, die zum Beispiel einen Zeilenumbruch enthalten. Sie kann zusammen mit Kommandos wie find -print0, perl -0, sort -z und xargs -0 dazu verwendet werden, beliebige Dateinamen zu verarbeiten.

REGULÄRE AUSDRÜCKE

Unter einem regulären Ausdruck versteht man ein Muster, das eine bestimmte Menge von Zeichenketten beschreibt. Reguläre Ausdrücke werden ganz ähnlich aufgebaut wie arithmetische Ausdrücke, indem man sie mit Hilfe verschiedener Operatoren aus kleineren Ausdrücken zusammensetzt.

Grep versteht zwei verschiedene Klassen regulärer Ausdrücke: “gewöhnliche” und “erweiterte”. Eine Unterscheidung, die für GNU grep keine Rolle spielt, da beide Varianten gleich mächtig sind. In anderen grep-Implementierungen steht mit gewöhnlichen regulären Ausdrücken jedoch nur ein eingeschränkter Funktionsumfang zur Verfügung. Die folgende Beschreibung bezieht sich auf erweiterte reguläre Ausdrücke; die Unterschiede zu gewöhnlichen regulären Ausdrücken sind im Anschluss daran zusammengefasst.

Grundlegendster Baustein sind die regulären Ausdrücke, die auf ein einzelnes Zeichen passen. Die meisten Zeichen, speziell alle Buchstaben und Ziffern, sind zugleich reguläre Ausdrücke, die auf sich selbst passen. Alle Metazeichen, die eine besondere Bedeutung besitzen, können durch einen vorausgehenden Rückstrich geschützt werden.

Eine Liste von Zeichen, die durch [ und ] eingeschlossen ist, passt auf ein beliebiges Zeichen daraus. Beginnt die Liste mit dem Symbol ^, so kehrt sich die Bedeutung um; sie passt auf alle Zeichen, die nicht in der Liste enthalten sind. Beispielsweise passt der reguläre Ausdruck [0123456789] auf eine beliebige einzelne Ziffer. Ein ganzer Bereich von Zeichen kann angegeben werden durch das erste und letzte Zeichen daraus, verbunden durch einen Bindestrich. Schließlich gibt es noch eine Reihe vordefinierter Klassen von Zeichen, im einzelnen: [:alnum:] (Buchstaben und Ziffern), [:alpha:] (Buchstaben), [:cntrl:] (Steuerzeichen), [:digit:] (Ziffern), [:graph:] (graphische Zeichen, das heißt [:alnum:] und [:punct:]), [:lower:] (Kleinbuchstaben), [:print:] (druckbare Zeichen), [:punct:] (Satzzeichen), [:space:] (Leerraum), [:upper:] (Großbuchstaben) und [:xdigit:] (Ziffern des Hexadezimalsystems). So bedeutet beispielsweise [[:alnum:]] für gewöhnlich dasselbe wie [0-9A-Za-z], jedoch hängt die zweite Form ab von der POSIX-Ländereinstellung und ASCII-Kodierung der Zeichen, während die erste Form davon unabhängig ist. (Man beachte, dass die eckigen Klammern Teil des symbolischen Namens der einzelnen Klassen sind. Zusätzlich dazu müssen noch die eckigen Klammern angegeben werden, die eine Liste von Zeichen begrenzen.) Die meisten Metazeichen verlieren innerhalb einer Zeichenkette ihre besondere Bedeutung. Um ein ] selbst zu beschreiben, muss es an erster Stelle der Kette gesetzt werden. Soll ^ als gewöhnliches Zeichen auftreten, darf es nicht an erster Stelle stehen. Das Zeichen - selbst muss an letzter Stelle der Kette auftauchen.

Der Punkt . passt auf jedes beliebige, einzelne Zeichen. Das Symbol \w ist ein Synonym für [[:alnum:]], \W ein Synonym für [^[:alnum]].

Das Dach ^ und das Dollarzeichen $ sind Sonderzeichen, die auf die leere Zeichenkette am Anfang beziehungsweise Ende einer Zeile passen. Ganz ähnlich passen die Symbole \< und \> auf die leere Zeichenkette am Anfang beziehungsweise Ende eines Wortes. Das Symbol \b passt auf die leere Zeichenkette an einem Wortrand; \B bezeichnet das Gegenteil davon und passt auf die leere Zeichenkette, falls die sich nicht an einem Wortrand befindet.

Ein regulärer Ausdruck kann gefolgt werden von einem oder mehreren Wiederholungsoperatoren:
?   Das vorhergehende Objekt ist optional und tritt höchstens einmal auf.
*   Das vorhergehende Objekt tritt kein Mal oder beliebig oft auf.
+   Das vorhergehende Objekt tritt ein- oder mehrmals auf.
{n} Das vorhergehende Objekt tritt genau n-mal auf.
{n,}
    Das vorhergehende Objekt tritt mindestens n-mal oder öfter auf.
{n,m}
    Das vorhergehende Objekt tritt mindestens n- und höchstens m-mal auf.

Zwei reguläre Ausdrücke können aneinander gefügt werden. Der entstehende reguläre Ausdruck passt auf jede Zeichenkette, die aus zwei aneinander gesetzten Teilketten besteht, sofern jede der Teilketten auf den zugehörigen regulären Teilausdruck passt.

Sind zwei reguläre Ausdrück durch den Infix-Operator | verbunden, so passt der gesamte reguläre Ausdruck auf jede Zeichenkette, die auf mindestens einen der beiden Teilausdrücke passt.

Wiederholungsoperatoren besitzen höhere Priorität als eine Aneinanderreihung. Am niedrigsten ist die Priorität der Alternative. Einzelne Teilausdrücke können in Klammern gesetzt werden, um diese Regeln explizit abzuändern.

Die Rückwärtsreferenz \n - wobei n für eine einzelne Ziffer steht -, passt auf die Zeichenkette, die wiederum auf den vorhergehenden, eingeklammerten Teilausdruck Nummer n des regulären Ausdrucks gepasst hat.

In gewöhnlichen regulären Ausdrücken besitzen die Metazeichen ?, +, {, }, |, ( und ) keine besondere Bedeutung. Statt dessen können die mit einem Rückstrich geschützten Versionen \?, \+, \{, \}, \|, \( und \) verwendet werden.

Das Metazeichen { wurde im ursprünglichen egrep nicht unterstützt. Andere Implementierungen unterstützen statt dessen \{, so dass portable Skripte { in egrep-Mustern generell vermeiden sollten. Als Alternative kann [{] verwendet werden, um das Zeichen { selbst zu beschreiben.

GNU egrep versucht, das ursprüngliche Verhalten zu unterstützen indem es annimmt, dass { keine besondere Bedeutung besitzt, falls es eine ungültige Intervallbeschreibung einleiten würde. So sucht beispielsweise das Kommando egrep '{1' nach der zwei Zeichen langen Zeichenkette {1, statt einen fehlerhaften regulären Ausdruck zu melden. Dieses Verhalten ist in POSIX.2 als Erweiterung erlaubt. Portable Skripte sollten darauf jedoch nicht vertrauen.

UMGEBUNGSVARIABLEN

GREP_OPTIONS
    Mit Hilfe dieser Variable lassen sich Standardoptionen definieren, die vor alle explizit angegebenen Optionen gesetzt werden. Enthält GREP_OPTIONS beispielsweise '--binary-files=without-match --directories=skip', so verhält sich grep, als ob die beiden Optionen --binary-files=without-match und --directories=skip auf der Kommandozeile vor allen weiteren Optionen angegeben worden wären. Mehrere Optionen werden durch Leerzeichen getrennt. Ein Rückstrich schützt das folgende Zeichen, so dass auch Optionen angegeben werden können, die selbst Leerzeichen oder Rückstriche enthalten.

LC_ALL, LC_MESSAGES, LANG
    Diese Variablen wählen die LC_MESSAGES-Ländereinstellung aus, die festlegt, in welcher Sprache grep seine Meldungen ausgibt. Die Ländereinstellung wird in der angegebenen Reihenfolge durch die erste gesetzte Variable bestimmt. Falls keine der Umgebungsvariablen gesetzt, der Katalog von Meldungen in der gewünschten Sprache nicht verfügbar oder grep ohne Mehrsprachenunterstützung (NLS) übersetzt worden ist, wird amerikanisches Englisch verwendet.

LC_ALL, LC_CTYPE, LANG
    Diese Variablen legen die LC_CTYPE-Ländereinstellung fest. Sie bestimmt den Typ eines jeden Zeichens, beispielsweise welche Zeichen als Leerraum angesehen werden, welche als Sonderzeichen und welche als Buchstaben. Die Ländereinstellung wird in der angegebenen Reihenfolge durch die erste gesetzte Variable bestimmt. Falls keine der Umgebungsvariablen gesetzt oder grep ohne Mehrsprachenunterstützung (NLS) übersetzt worden ist, wird die POSIX-Einstellung verwendet.

POSIXLY_CORRECT
    Falls gesetzt, verhält sich grep strikt nach dem POSIX.2-Standard, andernfalls ähnelt sein Verhalten eher dem anderer GNU-Programme. POSIX.2 verlangt, dass Optionen, die nach einem Dateinamen angegeben sind, als Dateinamen behandelt werden. Normalerweise behandelt grep sie immer als Optionen, gleichgültig an welcher Stelle sie auftreten. Ferner verlangt POSIX.2, unbekannte Optionen als “unzulässig” anzuzeigen. In den Standardeinstellungen meldet grep sie lediglich als “ungültig”. POSIXLY_CORRECT deaktiviert auch _N_GNU_nonoption_argv_flags_, das unten genauer beschrieben ist.

_N_GNU_nonoption_argv_flags_
    (N ist hier die numerische Kennung des grep-Prozesses.) Falls das i-te Zeichen dieser Umgebungsvariable den Wert 1 besitzt, wird das i-te Argument von grep nicht als Option verarbeitet, selbst wenn es wie eine Option aussieht. Ein Kommandozeileninterpreter kann diese Umgebungsvariable setzen um anzuzeigen, welche der Argumente erzeugt worden sind durch Mustererkennung von Dateinamen und deshalb keinesfalls als Optionen berücksichtigt werden sollen. Diese Verhalten steht nur in Verbindung mit der GNU C-Bibliothek zur Verfügung und nur dann, wenn POSIXLY_CORRECT nicht gesetzt ist.

DIAGNOSE

Normalerweise zeigt ein Rückgabewert von 0 an, dass Treffer gefunden worden sind, und 1, dass es keine Treffer gab. (Die Option -v kehrt die Bedeutung der Rückgabewerte um.) Ein Rückgabewert von 2 zeigt ein fehlerhaftes Suchmuster an, unzugängliche Eingabedateien oder andere Systemfehler.

FEHLER

Berichte über Fehler in grep sollten per E-Mail an bug-gnu-utils@gnu.org geschickt werden. Die Betreff-Zeile sollte das Wort “grep” enthalten.

Wiederholungsangaben im Konstrukt {m,n} können dazu führen, dass grep große Mengen Speicherplatz verbraucht. Darüber hinaus gibt es noch weitere ungewöhnliche reguläre Ausdrücke, deren Verarbeitung exponentiell viel Zeit und Speicher benötigt und dazu führen kann, dass grep den Speicherplatz erschöpft.

Rückwärtsreferenzen sind sehr langsam und können exponentiell viel Zeit in Anspruch nehmen.