Donnerstag, 13. Oktober 2016

103.7 Textdateien mit regulären Ausdrücken durchsuchen - grep, egrep und fgrep

grep


  • Zeilen einer Datei nach regulären Ausdrücken (oder auch ganze Wörter) untersuchen
  • Ausgabe erfolgt über stdout
  • nimmt keine Änderungen an der Datei selbst vor (im Gegensatz zu sed)
  • sinngemäße Übersetzung von grep -> Global search for Regular Exressions and Print out
  • wichtigste Optionen von grep
    • -v    invertiert die Ausgabe; Ausgabe der Zeilen, auf die der gesuchte Ausdruck NICHT zutrifft
    • -n    dem Suchergebnis eine Zeilennummerierung hinzufügen
    • -E    Verwendung der erweiterten regexp -> verhält sich dann wie egrep (siehe unten)
    • -c    zählt nur die Übereinstimmungen mit dem Suchmuster
    • -i    ignoriert Groß- und Kleinschreibung
Beispiele der Verwendung von grep:

  • :~# grep Willi Adressliste
    Sucht in der Datei Adressliste nach Zeilen, die das Wort Willi enhalten
  • :~# grep [Ww]ill[iy] Adressliste
    mögliche Ergebnisse des Suchmusters: Willy, willy, Willi, willi; Jede Klammergruppe ersetzt genau ein Zeichen
  • :~# grep -i will[iy] Adressliste
    -i ignoriert die Groß- und Kleinschreibung, daher ist auch das Ergebnis wiLLy zum Beispiel möglich
  • :~# grep W.illi Adressliste
    Suchmuster würde auch auf Ausdrücke wie Wolli oder Wqilli zutreffen
  • :~# grep [#] /etc/config.conf
    Alle Zeilen finden, die eine Raute enthalten (# am Anfang einer Zeile kennzeichnen unter Linux eigentlich fast immer Kommentare)
  • :~# grep -v [#] /etc/config.conf
    Invertiert das Ergebnis im Beispiel darüber, jedoch würden hier auch die Zeilen nicht angezeigt werden, die eine Raute innerhalb der Zeile enthalten und nicht nur am Anfang der Zeile (u.U. also auch die Code-Zeilen)
  • :~# grep [^#] /etc/config.conf
    Dieser Suchausdruck findet alle Zeichen, die NICHT mit einer Raute beginnen. In meinem Beispiel hatte dies zur Folge, dass die ganze Datei ausgegeben wurde
  • :~# grep -v ^[#] /etc/config.conf           :~# grep ^[^#] /etc/config.conf
    Beide Kommandos geben nur Zeilen aus, die am Anfang der Zeile keine Raute enthalten
  • :~# grep -v ^[#] /etc/config.conf | grep -v ^$ oder :~# grep ^[^#] /etc/config.conf | grep ^$
    Mit Hilfe der pipe auf ein zusätzliches grep werden die Leerzeilen aus der Ausgabe herausgefiltert (Leerzeile besteht nur aus ^ (Zeilenanfang) und $ (Zeilenende))
  • :~# grep 'Wort[1-9]*\>' Suchdatei
    enthält eine Zeichenkette, die entweder nur "Wort" enthält oder "Wort" mit einer beliebigen Anzahl (*) von Zahlen im Anschluss, aber am Wortende (\>). z.B. Wort1, Wort23, Wort2489
  • :~# grep 'Wort[1-9]\?\>' Suchdatei
    hier wird Wort nur in Verbindung mit EINER Zahl am Wortende oder ohne Zahl als Suchergebnis gelistet. Z.B Wort, Wort1, Wort2...
  • :~# grep '^Dec 10' /var/log/messages
    Alle Einträge zu einem bestimmten Datum suchen
  • :~# grep '1\{3,5\}' Suchdatei
    {3,5} grenzt die Anzahl der Wiederholungen ein. Dabei müssen die geschweiften Klammern jeweils durch einen Backslash vor Interpretation geschützt werden. Im Ergebnis würden alle Zeilen ausgegeben werden, wo 3,[A4 oder 5 Einsen aufeinander folgendend auftauchen
  • :~# grep '1\{3,\}' Suchdatei
    Mindestens 3 Wiederholungen, aber keine Maximalanzahl von Wiederholungen.
  • :~# grep '[0-9]\{3\}' Suchdatei
    sucht Zeilen, die 3 aufeinander folgende Ziffern enthalten
  • :~# grep '[A-Z]\{3\}' Suchdatei
    sucht Zeilen mit 3 aufeinander folgenden Großbuchstaben
  • :~# grep '\$ [0-9]\{3,\}\>' Suchdatei
    sucht nach mindestens dreistelligen Dollarbeträgen, siehe auch Erläuterung zu Metazeichen unten
  • :~# grep '\/var\/log\/' Suchdatei
    Wenn z.B. nach Dateipfaden in einer Datei gesucht wird, müssen die Slashes ebenfalls durch einen Backslash geschützt werden.
  • :~# grep 'c:\\windows\\system32\\' Suchdatei
    das Gleiche gilt sinngemäß auch für Windowsverzeichnisse
  • :~# grep '[A-Z]\+' Suchdatei
    Hier wird nach Zeilen gesucht, die mindestens einen Großbuchstaben enthalten
  • Einige Metazeichen müssen durch einen Backslash geschützt werden, damit grep sie nicht als Bestandteil des Suchmusters sieht. Es handelt sich hierbei um ?, +, {, }, |, ( und). Genauso müssen Metazeichen auch mit einem Backslash geschützt werden, wenn sie Bestandteil des Suchmusters sein sollen (z.B. das $ Zeichen, wenn es als Währungssymbol verstanden werden soll)

egrep und fgrep

  • egrep (extended) und fgrep  (fixed) waren ursprünglich Varianten von grep mit Zusatzfähigkeiten
  • Heute nicht mehr notwendig, da grep die zusätzlichen Funktionen zwischenzeitlich im Bauch hat
  • grep -E     entspricht egrep
  • grep -F     entspricht fgrep
  • ältere Skripte verwenden diese Programme noch
  • egrep unterstützt einen erweiterten Satz Metazeichen. Entsprechend wird bei der Suche auch mehr Rechenzeit benötigt
  • bei fgrep im Gegensatz werden Metazeichen im Suchmuster als normale Zeichen interpretiert
  • weitere Varianten: agrep für fehlertolerantes Suchen und zgrep für die Suche in komprimierten Archiven (beide sind NICHT prüfungsrelevant)  

Keine Kommentare:

Kommentar veröffentlichen