Grep

Aus DebianforumWiki
Wechseln zu: Navigation, Suche
WikiStandardprogramme Office und Co ‹ Grep


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.


grep.

Mit grep (get regularexpression) lassen sich Dateien nach bestimmten Textstücken durchsuchen. Die Suchmuster werden regular expressions genannt. Sie sind vielfältig einsetzbar, und werden nicht nur von grep verwendet.

Installation

Das Programm grep ist im essentiellen Paket

von Debian enthalten und ist deshalb auf jedem System installiert.

Aufruf von grep

user@debian:~$ grep [Optionen] Muster [Datei...]

oder

user@debian:~$ grep [Optionen] [-e Muster | -f Datei] [Datei...]
Option Beschreibung
-A NUM oder --after-context=NUM gibt zusätzlich NUM Zeilen nach der passenden Zeile aus.
-a text oder --text Verarbeite eine binäre Datei, als wäre sie Text. Dies entspricht der Option --binary-files=text.
-B NUM oder --before-context=NUM gibt zusätzlich NUM Zeilen vor der passenden Zeile aus.
-b oder --byte-offset gibt den Byte-Offset innerhalb der Datei vor jeder gefundenen Zeile an.
--binary-files=TYP gibt an, wie grep mit binären Dateien verfahren soll. Default für Typ ist binary, in diesem Fall gibt grep nur eine kurze einzeilige Mitteilung aus, ob die Datei das Muster enthält oder nicht. without-match nimmt an, dass eine binäre Datei keine passenden Zeichenketten enthält. Bei text verarbeitet grep die Datei als wäre sie eine Textdatei. Vorsicht: Die Ausgabe von binären Daten kann zu unerwünschten Resultaten führen, wenn die Ausgabe auf einem Terminal erfolgt, und dieses einige der Zeichenketten als Befehle interpretiert!
-C NUM oder --context=NUM gibt zusätzlich NUM Zeilen von Kontext aus. Zwischen zusammenhängende Gruppen von Treffern werden Zeilen mit "--" eingefügt.
-c oder --count unterdrückt die normale Ausgbabe und gibt stattdessen für jede Eingabedatei an, wieviele Zeilen auf die regular expression passen.
--colour[=Wann] oder --color[=Wann] Markiert Treffer farbig. Wann kann dabei "never", "always" oder "auto" sein.
-E oder --extended-regexp Verwendet die extended Variante beim Interpretieren der übergebenen regular expression.
-e Muster oder --regexp=Muster verwende Muster als regular expression. Nützlich um Ausdrücke zu schützen, die mit einem - beginnen.
-F oder --fixed-strings interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind.
-f Datei oder --file=Datei beziehe die Muster aus Datei, eines je Zeile. Eine leere Datei enthält keine Muster und passt somit auf keinen String.
-H oder --with-filename gibt den Dateinamen vor jedem Treffer aus.
-h oder --no-filename unterdrückt die Ausgabe des Dateinamens, wenn mehrere Dateien durchsucht werden.
-i oder --ignore-case unterscheide nicht zwischen Groß- und Kleinschreibung.
-L oder --files-without-match unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die keine Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt.
-l oder --files-with-match unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt.
-n oder --line-number gibt die Zeilennummer vor jedem Treffer aus.
-o oder --only-matching gibt nur die passende Zeichenkette aus.
-P oder --perl-regexp verwendet Perl regular expressions.
-q oder --quiet, --silent schreibt nichts auf die Standardausgabe und stoppt beim ersten Treffer.
-r oder -R oder --recursive liest alle Dateien unter jedem Verzeichnis rekursiv.
-v oder --invert-match Invertiert die Suche und liefert alle Zeilen die nicht auf das gesuchte Muster passen.

grep kennt noch eine Reihe von weiteren Optionen, die man mit Hilfe der Option --help aufrufen kann. Oder man schaut in die Manpages von grep.


Beispiele

Findet rekursiv (-r) alle Dateien im Verzeichnis /var/www, in denen die Zeichenkette debian auftritt, unabhängig von Groß- und Kleinschreibung (Option -i). Die Treffer werden unter Angabe der Datei und der Zeilennummer (Option -n) auf der Standardausgabe ausgegeben.

user@debian:~$ egrep -rni -e "debian" /var/www

Gibt an, wie oft (Option -c) die Zeichenkette debian-forum in welchen Dateien im Verzeichnis /usr/src vorkommt.

user@debian:~$ egrep -rc -e "debian-forum" /usr/src


Varianten

Es gibt es noch drei Varianten von grep:

  • egrep entspricht grep -E (untere Beschreibung von regular expressions bezog sich auf diese Variante)
  • fgrep entspricht grep -F
  • rgrep entspricht grep -r


Grafische Werkzeuge

Für den Einsatz innerhalb einer Desktop-Umgebung sind gedacht:


Regular Expression

Es soll noch kurz erläutert werden, wie man das, was man sucht überhaupt beschreibt. Die Beschreibung eines Textmusters wird als regular expression (regulärer Ausdruck) bezeichnet. Sie sind ähnlich mathematischen Ausdrücken aufgebaut: kleinere Untereinheiten werden durch Operatoren miteinander verknüpft. Es gibt zwei Variationen von regular expressions, basic und extended die folgenden Beschreibungen beziehen sich auf die extended Variante. Um diese beim Aufruf von grep zu verwenden, kann es entweder mit dem Parameter -E aufgerufen werden, oder durch den alternativen Befehl egrep.

Die grundlegenden Einheiten eines regulären Ausdrucks sind solche, die ein einzelnes Zeichen beschreiben. Die meisten Zeichen (darunter alle Buchstaben und Ziffern) passen auf sich selbst, zum Beispiel passt "4" auf alle Vieren. Alle Zeichen mit einer besonderen Bedeutung (wie zum Beispiel der Punkt ".") lassen sich durch das Voranstellen eines Backslashes "\" ihrer besonderen Bedeutung berauben. Um also einen Punkt "." zu finden muss man in dem regulären Ausdruck ein "\." verwenden. Um den Backslash selbst zu finden benötigt man ein "\\".


Listen (bracket expressions)

Erwartet man an einer Stelle innerhalb des Regulären Ausdrucks nicht ein ganz bestimmtes Zeichen, sondern nur eines aus einer spezifischen Liste, so kann man dies durch eine sogenannte bracket expression ausdrücken. Die Liste der Zeichen, aus der das zu findende Zeichen stammen soll wird dazu einfach in eckigen Klammern "[]" angegeben. Um beispielsweise alle Buchstaben "a", egal ob groß oder klein zu finden verwendet man folgenden regulären Ausdruck: "[Aa]" Möchte man alle Zeichen finden, die nicht in der Liste stehen, die Liste also negieren, so muss das erste Zeichen in der Liste ein Caret "^" sein. Ein regulärer Ausdruck der Form "[^Aa]" passt also auf alle Zeichen, die weder ein großes noch ein kleines "a" sind. Kurzes Beispiel: "[Aa]lpha" findet alle Textstücke "Alpha" und "alpha".

Um die Listen der bracket extensions kompakt darstellen zu können, werden range expressions verwendet. Ein range expression wird durch zwei Zeichen, die durch einen Bindestrich miteinander verbunden sind dargestellt: "[a-d]". Ein solcher Ausdruck passt auf alle Zeichen, die in der Sortierung des Zeichensatzes zwischen die beiden Zeichen fallen. Leider hängt diese Sortierung von der verwendeten locale Einstellung ab. In der Standard C locale würde obiges Muster "[a-d]" einem regulären Ausdruck von "[abcd]" entsprechen, während er bei vielen anderen locales einem Ausdruck "[aBbCcDd]" entsprechen würde. Um die C locale für die Zeichensortierung zu erzwingen, kann man der Variablen LC_CTYPE den Wert C zuweisen:

LC_CTYPE=C befehl # gilt nur für diesen Befehl
LC_CTYPE=C grep -E [a-d] Datei Beispiel
export LC_CTYPE=C gilt für alle nachfolgenden Befehle


Die meisten Zeichen mit besonderer Bedeutung verlieren diese Bedeutung innerhalb eines bracket expressions. Um ein Zeichen "]" in die Liste aufzunehmen, muss es an der ersten Stelle in der Liste stehen. Um das Caret "^" in die Liste aufzunehmen, kann es irgendwo in der Liste stehen, nur nicht an der ersten Stelle. Um den Bindestrich "-" in die Liste einzufügen, muss es an letzter Stelle stehen.

Darüber hinaus gibt es einige vordefinierte Listen:

  • [:alnum:] alle Ziffern und Buchstaben
  • [:alpha:] alle Buchstaben
  • [:cntrl:] alle Kontrollzeichen
  • [:digit:] alle Ziffern
  • [:lower:] alle Kleinbuchstaben
  • [:punct:] alle Satzzeichen
  • [:blank:] Leerzeichen
  • [:space:] Zeichen die Leerraum erzeugen (Leerzeichen, Zeilenvorschub, ...)
  • [:upper:] alle Großbuchstaben

Die vordefinierten Listen müssen aber auch in eckige Klammern eingeschlossen zu werden:

-> falsch:

  • grep -E '[:alnum:]' Datei # findet z.B. 'a', da es eines der Zeichen ':alnum:' ist, aber nicht 'b' oder '1' (die vordefinierte Liste wird nicht als solche interpretiert!)

-> richtig:

  • grep -E 'alnum:' Datei # findet sowohl 'a', als auch 'b' oder '1', da die vordefinierte Liste nun als "Buchstabe oder Zahl" interpretiert wird

-> auch richtig:

  • grep -E '[[:alnum:] ]' Datei # findet zusätzlich zu Buchstaben und Zahlen auch Leerzeichen

-> auch richtig:

  • grep -E '[0-9a-zA-Z]' Datei # entspricht alnum:

Besondere Zeichen

  • Der Punkt "." passt auf ein beliebiges Zeichen.
  • Das Caret "^" findet den Anfang einer Zeile.
  • Das Dollarzeichen "$" findet das Ende einer Zeile.
  • Die Symbole "\<" passen auf den Beginn eines Wortes.
  • Die Symbole "\>" passen auf das Ende eines Wortes.


Wiederholungsoperatoren

Reguläre Ausdrücke können mit Hilfe dieser Operatoren öfter wiederholt werden.

  • "?" Der vorangegangene Ausdruck ist Optional und wird maximal einmal angetroffen.
  • "*" Der vorangegangene Ausdruck wird beliebig oft (auch keinmal) vorgefunden.
  • "+" Der vorangegangene Ausdruck wird mindestens einmal gefunden.
  • "{n}" Der vorangegangene Ausdruck wird genau n-mal gefunden.
  • "{n,}" Der vorangegangene Ausdruck wird mindestens n-mal oder öfter angetroffen.
  • "{n,m}" Der vorangegangene Ausdruck wird mindesten n-mal und maximal m-mal angetroffen.


Zusammenführung von regulären Ausdrücken

Mehrere reguläre Ausdrücke können durch aneinander fügen zusammengeführt werden. Ein solcher Ausdruck findet dann alle Zeichenketten, die aneinander gehängt zu dem jeweiligen Ausdruck passen. Das obige Beispiel "[Aa]lpha" stellt eine solche Verkettung dar. Es ist aus den Einzelnen Bausteinen "[Aa]", "l", "p", "h" und "a" aufgebaut.


Verknüpfung durch "oder"

Durch den Operator "|" lassen sich reguläre Ausdrücke mit einem "oder" verknüpfen. Der daraus entstehende Ausdruck findet Zeichenketten, die entweder auf den einen oder den anderen Ausdruck passen.

Kurzes Beispiel: "[Aa]lpha|[Bb]ravo" findet alle Textstücke "Alpha", "alpha", "Bravo" und "bravo" (am Besten nur mit Parameter -E oder egrep).

Vorrang der Regeln

Ähnlich wie bei mathematischen Ausdrücken (Punkt- vor Strichrechnung) unterliegen die Verknüpfungsoperatoren einer gewissen Rangfolge: Wiederholungen kommen vor Verkettungen, die wiederum vor dem "oder" kommen. Wie auch in arithmetischen Ausdrücken lassen sich diese Regeln durch Klammern überschreiben.

Geklammerte Ausdrücke referenzieren

Eine Teilzeichenkette, die auf einen geklammerten Teilausdruck gepasst hat, lässt sich durch "\n" referenzieren. Dabei steht "n" für eine einzelne Ziffer, die den n-ten geklammerten Teilausdruck auswählt.