In diesem Kapitel erfahren Sie, wie Dateien und Verzeichnisse nach Stichwörtern durchsuchen.
Mit dem Befehl grep können Sie in einer Datei nach einer bestimmten Zeichenfolge suchen. grep wird in folgendem Format eingegeben:
$ grep zeichenfolge datei |
zeichenfolge ist die gesuchte Zeichenfolge und datei die Datei, in der gesucht werden soll.
Eine Zeichenfolge ist eine beliebige Kombination aus einem oder mehreren Zeichen. Einzelne Buchstaben werden ebenso als Zeichenfolgen bezeichnet wie Wörter oder ganze Sätze. Zeichenfolgen können außerdem Leerzeichen, Satzzeichen und unsichtbare Steuerzeichen enthalten.
Im folgenden Beispiel wird in der Datei telefon nach der Rufnummer von Edgar Allan Poe gesucht:
$ grep Poe telefon Edgar Allan Poe x728364 $ |
Wenn die angegebene Zeichenfolge mehrmals vorkommt, werden alle passenden Zeilen angezeigt:
$ grep Edgar telefon Edgar Winter x764383 Edgar Allan Poe x728364 $ grep Ed telefon Eduard Müller x742362 Edgar Winter x764383 Edgar Allan Poe x728364 $ |
Da grep zwischen Groß- und Kleinbuchstaben unterscheidet, müssen Sie bei der Eingabe auf die korrekte Schreibweise achten:
$ grep edgar telefon $ grep Edgar telefon Edgar Winter x764383 Edgar Allan Poe x728364 $ |
Beim ersten Versuch wurden keine passenden Zeilen gefunden, weil die Zeichenfolge edgar" in der Datei nicht vorkommt.
grep wird häufig zusammen mit anderen Befehlen verwendet, um nicht benötigte Informationen vor der Ausgabe auszufiltern. Dazu werden die von dem Befehl ausgegebenen Daten mit Hilfe des Pipe-Symbols | an grep übergeben.
Mit dem folgenden Befehl zeigen Sie alle Dateien mit der Endung .ps an, die im Mai erstellt wurden:
$ ls -l *.ps | grep Mai |
Der erste Teil der Befehlszeile
ls -l *.ps |
gibt eine Liste aller Dateien mit der Endung .ps im aktuellen Verzeichnis aus:
Der zweite Teil,
| grep Mai |
übergibt diese Liste an den Befehl grep, der die Dateien ausfiltert, in deren Beschreibung die Zeichenfolge Mai" vorkommt:
$ ls -l *.ps | grep Mai -rw-r--r-- 1 elvis 2356 Mai 22 12:56 clock.ps -rw-r--r-- 1 elvis 5644 Mai 22 15:07 buttons.ps $ |
Um nach Zeichenfolgen zu suchen, die aus mehr als einem Wort bestehen, setzen Sie die Zeichenfolge in einfache oder doppelte Anführungszeichen:
$ grep "Eduard Müller" telefon Eduard Müller x742362 $ |
Sie können auch in mehreren Dateien nach einer Zeichenfolge suchen. Wird die Zeichenfolge gefunden, gibt grep den (die) Namen der Datei(en), einen Doppelpunkt und danach die gefundene Zeile aus:
$ grep at * film:Walter Matthau alaska:Alaska ist der größte Staat der USA. computer:zeichnen sich in der Datenverarbeitung neue Trends $ |
Um in einer Datei nach allen Zeilen zu suchen, in denen eine bestimmte Zeichenfolge nicht enthalten ist, geben Sie grep mit der Option -v ein. Im folgenden Beispiel wird in den Dateien des aktuellen Verzeichnisses nach allen Zeilen gesucht, in denen der Buchstabe e nicht vorkommt:
$ ls alaska film schulung telefon termine $ grep -v e * film:Marlon Brando telefon:Hans Schmid x834657 $ |
Sie können mit dem Befehl grep auch nach mehreren gleichartigen Wörtern oder Zeichenfolgen suchen, die Sie durch einen regulären Ausdruck spezifizieren. Reguläre Ausdrücke bestehen aus Buchstaben, Zahlen und speziellen Zeichen, die als Metazeichen bezeichnet und von grep auf eine bestimmte Weise interpretiert werden. Um eine Interpretation durch das System zu verhindern, müssen Metazeichen in der Befehlszeile in Anführungszeichen gesetzt oder mit einem Gegenschrägstrich (\) geschützt werden. Beispiele für Metazeichen sind: & ! . * $ ? und \.
Ein Zirkumflex (^) steht für den Beginn einer Zeile. Mit dem folgenden Befehl suchen Sie nach allen Zeilen in der Datei liste, die mit dem Buchstaben b" beginnen:
$ grep '^b' liste |
Ein Dollarzeichen ($) steht für das Ende einer Zeile. Mit dem nächsten Befehl suchen Sie nach allen Zeilen, die mit dem Buchstaben b" enden:
$ grep 'b$' liste |
Sie können die beiden Zeichen auch kombinieren. Mit dem folgenden Befehl suchen Sie nach allen Zeilen, in denen nur der Buchstabe b" steht:
$ grep '^b$' liste |
suchen Sie also nach allen Zeilen, in denen eine Zeichenfolge aus de" und einem beliebigen dritten Buchstaben enthalten ist, z. B. der", dem", Katheder" oder Ende" (Leerzeichen sind ebenfalls gültig).
Ein Stern (*), der auf ein einzelnes Zeichen folgt, steht für eine beliebige Anzahl des vorangehenden Zeichens. Folgt der Stern auf einen regulären Ausdruck, steht er für eine beliebige Anzahl dieses Ausdrucks.
Die Verwendung dieses Metazeichens ist mitunter nicht ganz einfach, weil der Stern auch für die Anzahl Null stehen kann. Wenn Sie beispielsweise nach allen Wörtern suchen wollen, in denen die Buchstabenfolge qu" vorkommen, geben Sie folgendes ein:
$ grep 'qu*' list |
Soll dagegen nach allen Wörtern gesucht werden, die den Buchstaben n" enthalten, müßten Sie folgenden Befehl eingeben:
$ grep 'nn*' list |
Um nach allen Wörter zu suchen, in denen die Buchstabenfolge nn" vorkommt, müßten Sie den Befehl so eingeben:
$ grep 'nnn*' liste |
Am besten experimentieren Sie ein wenig mit solchen Suchmustern, um sich mit der Bedeutung der Metazeichen vertraut zu machen.
Nehmen wir an, Sie wollen in einem Text nach allen Zeilen suchen, in denen ein Dollarzeichen vorkommt. Damit grep das Zeichen nicht als Metazeichen interpretiert, müssen Sie ihm einen Gegenschrägstrich (\) voranstellen. Auf diese Weise kann auch nach allen weiteren Metazeichen (& ! . * ? und \ selbst) gesucht werden.
Mit dem folgenden Ausdruck suchen Sie nach allen Zeilen, die mit einem Punkt beginnen:
$ grep ^\. |
Auf diese Weise könnten Sie zum Beispiel in einem mit nroff oder troff formatierten Text nach Formatanweisungen suchen, da diese immer mit einem Punkt beginnen. In Tabelle 4-1 sind die in regulären Ausdrücken am häufigsten verwendeten Elemente zusammengefaßt.
Tabelle 4-1 grepSuchmuster-Elemente
Zeichen |
Steht für |
---|---|
Beginn einer Textzeile |
|
Ende einer Textzeile |
|
Ein beliebiges Zeichen |
|
[...] |
Ein beliebiges Zeichen aus der in Klammern stehenden Liste bzw. dem in Klammern stehenden Bereich |
[^...] |
Ein beliebiges Zeichen, das in der Liste oder dem Bereich nicht vorkommt |
Eine beliebige Anzahl des vorhergehenden Zeichens oder Ausdrucks |
|
.* |
Eine beliebige Anzahl eines beliebigen Zeichens |
Hebt die spezielle Bedeutung des nachfolgenden Zeichens auf |
Diese Elemente können Sie auch bei Suchläufen im Texteditor vi verwenden.
Wenn nach mehreren Wörtern gesucht werden soll, müssen diese in der Befehlszeile in Anführungszeichen gesetzt werden. Um in allen Dateien des aktuellen Verzeichnisses nach dem Ausdruck Preise inkl. Mehrwertsteuer" zu suchen, würden Sie also folgendes eingeben:
$ grep "Preise inkl. Mehrwertsteuer" * |
Statt der doppelten können auch einfache Anführungszeichen (') verwendet werden. Damit stellen Sie gleichzeitig sicher, daß eventuell in der Zeichenfolge vorkommende Metazeichen wie normale Zeichen interpretiert werden. Das Metazeichen ! muß auch in Anführungszeichen mit einem Gegenschrägstrich entwertet werden. Um Probleme auszuschließen, sollten Sie das bei den anderen Metazeichen ebenfalls tun, wenn diese als normale Textzeichen behandelt werden sollen.
Wenn Sie folgenden Befehl eingeben, werden alle Zeilen in der Datei liste angezeigt:
$ grep $ liste |
Mit dem nächsten Befehl zeigen Sie dagegen nur die Zeilen an, in denen das Zeichen $" vorkommt:
$ grep '\$' liste |
Weitere Informationen zu grep(1) finden Sie in den man Pages(1): User Commands.