Zu_Befehl.gif

Hier grept der Bär!

Zu Befehl

01.07.2000
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.

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.

Grep und find – ein starkes Team

Erinnern Sie sich an die letzte Folge, in der es um find ging? Dort wurde von einer Kombination der Befehle mit -exec gesprochen. Eine tolle Sache – denn jetzt lassen sich ganze Verzeichnisbäume rekursiv nach Zeichenketten durchsuchen. grep alleine reicht hier nicht aus, eine sinnvolle Zusammensetzung der Kommandos könnte so aussehen:

huhn@huehnerstall ~ > find . -exec grep -l bla '{}' ';'
./test/datei2
./datei3
./datei1

Im Unterschied zum Aufruf grep bla * werden hier die von find gefundenen Dateien einzeln an grep übergeben. In diesem Fall zeigt grep ohne die Option -l nicht die Datei an, in der das Suchmuster gefunden wurde, was bei mehreren Treffern leicht unübersichtlich wird.

Möchte man nur bestimmte Dateien durchforsten, kann man die Auswahl der von find zu findenden Files in verschiedener Weise einschränken: Um beispielsweise alle .tex-Dateien in allen Unterverzeichnissen nach dem String \usepackage zu durchsuchen, schreibt man

find . '*.tex' -exec grep -l '\usepackage' '{}' ';'

Hinweis:

grep

und Verzeichnisse

Die meisten grep-Versionen geben eine Fehlermeldung aus, wenn man ihnen als Argument einen Verzeichnisnamen übergibt. Möchte man dieses verhindern, kann man die von find ausgewählten Dateien z. B. mit der Option -type f auf reguläre Dateien beschränken.

grep findet keine Klartext-Suchmuster in komprimierten Dateien. Dazu kann man stattdessen das Kommando zgrep verwenden (siehe auch die man-Page dazu). Übrigens: Alles über komprimierte Dateien gibt's in der nächsten "Zu Befehl"-Folge – bis dahin fröhliches Greppen!

Glossar

Shell

Der Kommandozeileninterpreter – hier werden die Befehle, die Sie eintippen, dem Betriebssystem verständlich gemacht. Wie auf anderen Unix-Systemen kann man zwischen den gängigen Shell-Modellen wählen: bash (die Linux-Standard-Shell), ksh, csh etc.

Wildcards

Sonderzeichen, die Teile von Zeichenketten unbestimmt lassen. Ein Fragezeichen ? in einer Zeichenkette lässt nur denjenigen Buchstaben dieser Zeichenkette unbestimmt (z. B. h?llo => hallo, hGllo, h7llo,…), an dem sich das Fragezeichen befindet, während ein * für beliebig viele verschiedene Zeichen steht (z.B. G*ss => Guss, Genuss). Ruft man beispielsweise grep bla * auf, werden alle Dateien im aktuellen Verzeichnis nach "bla" durchsucht.

Kontext

Eigentlich bedeutet Kontext soviel wie "Zusammenhang" – übertragen auf Textdateien sind dies Zeilen, die unmittelbar vor und hinter der Fundstelle liegen. Sich diese Zeilen mit ausgeben zu lassen, hilft Ihnen dann, besser zu erkennen, welchen Ausschnitt des Textes grep gefunden hat, weil er nicht mehr so "aus dem Kontext gerissen" ist.

Pager

Ein Programm, das die Bildschirmausgabe eines anderen Programms abfängt und seitenweise anzeigt, z. B. less oder more.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare