In der letzten "Zu Befehl"-Folge wurde gezeigt, wie man mit Hilfe von find Dateien (wieder) finden kann. Manchmal ist das jedoch nicht genug, man weiß genau, dass irgendwo in einer Datei eine Information steckt – welche der 20 Dateien enthält bloß die Zeichenkette "Mit freundlichen Grüßen"? Mit dem Kommando grep lässt sich gezielt nach Mustern suchen. Als Ergebnis erhält man entweder den gefundenen Textabschnitt oder die Anzahl der Zeilen, in denen das Suchmuster gefunden wurde. Und es wird noch besser: Wenn man grep und find kombiniert, kann man alle Dateien, die bestimmten (find-) Bedingungen entsprechen, durchforsten.
Mal mir ein Suchmuster!
Der Begriff "Suchmuster" ist jetzt schon oft gefallen, aber was kann man sich denn nun darunter vorstellen? Diese sogenannten "regular expressions" (siehe auch man regex) haben normalerweise zwei Komponenten: die Angabe, nach welchem Zeichen gesucht wird, und die Angabe, wie oft die gesuchten Zeichen auftreten dürfen. Was sich kompliziert anhört, kann man sich in einer Tabelle ganz einfach vor Augen führen (s. Tabelle 1).
Tabelle 1: Suchmuster – "regular expressions"
| Muster | 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 |
*
|
das Zeichen darf beliebig oft oder gar nicht auftreten |
+
|
das Zeichen darf beliebig oft, muss aber mindestens einmal auftreten |
{n}
|
das Zeichen muss genau n-mal auftreten
|
{,n}
|
das Zeichen darf höchstens n-mal auftreten
|
{n,}
|
das Zeichen muss mindestens n-mal auftreten
|
{n,m}
|
das Zeichen muss mindestens n-mal und höchstens m-mal auftreten
|
Viele dieser Muster werden Sie nicht sehr häufig benutzen, dennoch sind einige davon (gerade in Zusammenhang mit grep) wichtig. Wenn Sonderzeichen, wie z. B. ?, * oder + im Suchmuster verwendet werden sollen, muss vor das entsprechende Zeichen der Backslash ("\") gestellt werden, weil das Zeichen sonst von der Shell interpretiert wird. Beachten sollte man weiterhin, dass Groß- und Kleinschreibung unterschieden wird. So sucht [^A-Z] beispielsweise nach allen Zeichen, die keine Großbuchstaben sind.
Auf das grep, fertig, los!
Nachdem Sie jetzt wissen, wonach Sie suchen können, sollten wir uns die einzelnen Optionen von grep anschauen. Der einfachste Aufruf lautet grep suchmuster datei, wobei auch mehrere Dateien durchsucht werden können, indem man sie entweder beim Aufruf hintereinander hängt oder durch Shell-Wildcards erfasst. Jede Zeile, in der der Textabschnitt auftaucht, wird zeilenweise ausgegeben, der Output könnte so aussehen:
huhn@huehnerstall ~ > grep Zeichen text muss vor das entsprechende Zeichen der weil das Zeichen sonst von der Shell interpretiert
Sie möchten mehr Kontext? Kein Problem, grep -num ... (wobei num die Zeilenanzahl ist) zeigt zusätzlich zu der Zeile mit dem Suchmuster die num unmittelbar davorstehenden und nachfolgenden Zeilen. Ein Tipp: Sollten die Zeilen einmal aus dem Fenster heraus scrollen, leiten Sie den Aufruf zu einem Pager Ihrer Wahl um, z. B. grep -10 Zeichen text | less. Übrigens ist die gerade gezeigte Option nicht zu verwechseln mit dem Aufruf grep -n datei – hier sehen Sie vor der Zeile mit dem Suchwort auch die Zeilennummer. Wenn man einfach nur wissen möchte, in wievielen Zeilen das gesuchte Wort auftaucht, verwendet man den Parameter grep -c muster datei – er gibt nur die Anzahl der Zeilen an.
Was für die Suchmuster gilt, gilt auch für grep, es arbeitet "case sensitive", d. h. Groß- und Kleinschreibung sind relevant. Wenn diese Unterscheidung nicht gewünscht ist, können Sie sie mit grep -i ... umgehen. Vorsicht: Dabei tauchen oft auch Ergebnisse auf, die das gesuchte Wort als Teilwort enthalten. Wenn Sie z. B. grep -i die datei tippen, werden also auch Wörter wie "Diese" oder "dieser" gefunden. Hier kommt Abhilfe: Kombinieren Sie die -i-Option mit -w – jetzt werden nur noch ganze Wörter gefunden.
In einer der letzten Folgen tauchten Probleme mit Bindestrichen am Dateianfang auf – rm -datei ließ sich nur mit einem Trick löschen: entweder mit einem rm ./-datei oder mit dem Aufruf rm -- -datei. (!!!DOPPEL-MINUS!!!) Auch grep hat Schwierigkeiten mit dem -. Die Aufforderung, einen Text nach dem Begriff "-ctime" zu durchsuchen, wird vom System zurückgewiesen:
huhn@huehnerstall ~ > grep -ctime text grep: invalid option -- t (!!!DOPPEL-MINUS!!!) Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' (!!!DOPPEL-MINUS!!!) for more information.
Das -c wird interpretiert, aber das t kann schon nicht mehr ausgewertet werden. Abhilfe schafft der Parameter -e suchmuster – jetzt wird "-ctime" richtig ausgewertet.
Oft werden Suchmuster mit regulären Ausdrücken lang und kompliziert. Möchten Sie mehrmals nach komplexen Mustern suchen, bietet sich die Möglichkeit, diese Ausdrücke in einer Datei abzuspeichern. Diese kann dann mit grep -f suchmusterdatei datei eingebunden werden.



