Textsuche mit grep unter Linux

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie mit dem leistungsstarken Befehl grep effektiv nach Texten in Dateien auf einem Linux-System suchen. Sie beginnen mit grundlegenden Suchvorgängen nach bestimmten Zeichenfolgen in einzelnen und mehreren Dateien und verstehen dabei, wie grep gefundene Zeilen anzeigt und die Quelldatei identifiziert, wenn an mehreren Orten gleichzeitig gesucht wird.

Auf dieser Basis aufbauend werden Sie fortgeschrittene Funktionen erkunden, um Ihre Suchergebnisse zu verfeinern. Sie lernen, Zeilennummern für einen besseren Kontext einzublenden, Anker wie ^ und $ zu verwenden, um Muster am Anfang oder Ende einer Zeile zu finden, und die Möglichkeiten von einfachen sowie erweiterten regulären Ausdrücken zu nutzen, um komplexe und flexible Musterabgleiche durchzuführen.

Eine grundlegende Suche in Dateien mit grep durchführen

In diesem Schritt lernen Sie die grundlegende Verwendung des Befehls grep kennen, um einfache Suchvorgänge in Dateien durchzuführen. Der Befehl grep (Global Regular Expression Print) ist ein mächtiges Kommandozeilenwerkzeug, mit dem nach einer bestimmten Zeichenfolge oder einem Muster in einer oder mehreren Dateien gesucht wird, um die entsprechenden Zeilen auszugeben.

Die Basissyntax für grep lautet: grep PATTERN [FILE...]

Beginnen wir mit einer einfachen Aufgabe: Wir suchen Informationen über unseren aktuellen Benutzer labex in der Benutzerdatenbank des Systems. Diese Informationen sind in der Datei /etc/passwd gespeichert.

Führen Sie den folgenden Befehl in Ihrem Terminal aus, um alle Zeilen in der Datei /etc/passwd zu finden, die die Zeichenfolge labex enthalten:

grep labex /etc/passwd

Sie sollten eine Ausgabezeile aus der Datei sehen, die Ihren Benutzernamen labex enthält.

labex:x:5000:5000::/home/labex:/usr/bin/zsh

Der Befehl grep kann auch mehrere Dateien gleichzeitig durchsuchen. Wir suchen nun nach der Zeichenfolge labex in drei wichtigen Systemkonfigurationsdateien: /etc/passwd, /etc/shadow (in der verschlüsselte Benutzerkontoinformationen gespeichert sind) und /etc/group (in der Benutzergruppen definiert sind).

Da die Datei /etc/shadow sensible Informationen enthält, benötigen Sie Administratorrechte, um sie zu lesen. Sie können den Befehl sudo verwenden, um grep mit diesen Rechten auszuführen. Der Benutzer labex ist so konfiguriert, dass er sudo ohne Passworteingabe nutzen kann.

Führen Sie den folgenden Befehl aus, um in allen drei Dateien nach labex zu suchen:

sudo grep labex /etc/passwd /etc/shadow /etc/group

Beachten Sie, dass grep bei der Suche in mehreren Dateien jeder passenden Zeile den Namen der Datei voranstellt, in der der Treffer gefunden wurde.

/etc/passwd:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:sudo:x:27:labex
/etc/group:ssl-cert:x:121:labex
/etc/group:labex:x:5000:
/etc/group:public:x:5002:labex

Dies zeigt Ihnen alle Zeilen in diesen drei Dateien an, die mit dem Benutzer labex in Verbindung stehen.

Zeilennummern mit der Option -n anzeigen

In diesem Schritt lernen Sie, wie Sie die Ausgabe von grep verbessern können, indem Sie die Zeilennummern der Fundstellen anzeigen lassen. Dies ist besonders nützlich, wenn Sie ein Muster in einer großen Datei lokalisieren müssen, um es später zu bearbeiten oder zu analysieren. Die Option -n weist grep an, jeder Ausgabezeile die entsprechende Zeilennummer aus der Eingabedatei voranzustellen.

Wir bauen auf dem Befehl aus dem vorherigen Schritt auf. Sie haben nach dem Benutzer labex in drei Systemdateien gesucht. Nun führen Sie dieselbe Suche durch, lassen sich aber zusätzlich die Zeilennummern für jeden Treffer anzeigen.

Fügen Sie die Option -n zu dem Befehl hinzu, den Sie im vorherigen Schritt ausgeführt haben. Denken Sie daran, sudo zu verwenden, da Sie weiterhin auf die geschützte Datei /etc/shadow zugreifen.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo grep -n labex /etc/passwd /etc/shadow /etc/group

Sie sehen eine ähnliche Ausgabe wie zuvor, aber jetzt ist jeder Zeile der Dateiname und die Zeilennummer des Treffers vorangestellt, getrennt durch Doppelpunkte.

/etc/passwd:32:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:32:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:21:sudo:x:27:labex
/etc/group:60:ssl-cert:x:121:labex
/etc/group:61:labex:x:5000:
/etc/group:62:public:x:5002:labex

Achten Sie auf die Zahlen wie 32, 32, 21, 60, 61 und 62 in der Ausgabe. Dies sind die Zeilennummern. Zum Beispiel wurde die Zeichenfolge labex in Zeile 32 von /etc/passwd und Zeile 32 von /etc/shadow gefunden. Diese einfache Option macht grep zu einem noch effektiveren Werkzeug, um Dateiinhalte zu navigieren und zu verstehen.

Zeilenpositionen mit den Ankern ^ und $ abgleichen

In diesem Schritt vertiefen Sie Ihre grep-Kenntnisse, indem Sie lernen, Anker zu verwenden. Anker sind Sonderzeichen in regulären Ausdrücken, die keine tatsächlichen Zeichen abgleichen, sondern Positionen innerhalb einer Zeile. Dies ermöglicht es Ihnen, spezifischere und leistungsfähigere Suchmuster zu erstellen. Die beiden gebräuchlichsten Anker sind:

  • ^ (Zirkumflex): Entspricht dem Anfang einer Zeile.
  • $ (Dollarzeichen): Entspricht dem Ende einer Zeile.

Schauen wir uns an, wie diese in der Datei /etc/passwd funktionieren.

Betrachten wir zunächst eine einfache Suche nach der Zeichenfolge root in /etc/passwd:

grep root /etc/passwd

Sie erhalten möglicherweise mehrere Zeilen in der Ausgabe, da auch andere Einträge die Zeichenfolge "root" enthalten könnten.

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Verfeinern wir dies nun. In der Datei /etc/passwd ist das erste Feld jedes Datensatzes der Benutzername. Um gezielt den Datensatz für den Benutzer root zu finden, können Sie Ihre Suche mit ^ am Zeilenanfang verankern.

Führen Sie den folgenden Befehl aus. Das Muster ^root weist grep an, nur Zeilen zu finden, die mit root beginnen.

grep ^root /etc/passwd

Diesmal ist die Ausgabe wesentlich präziser und zeigt nur die Zeile für den Benutzer root an.

root:x:0:0:root:/root:/bin/bash

Als Nächstes verwenden wir den Anker für das Zeilenende, $. Das letzte Feld in einem /etc/passwd-Datensatz gibt die Standard-Login-Shell des Benutzers an. Wir können dies nutzen, um alle Benutzer zu finden, die /bin/bash als Standard-Shell verwenden.

Das Muster bash$ findet jede Zeile, die mit der Zeichenfolge bash endet.

grep bash$ /etc/passwd

Dieser Befehl zeigt alle Benutzereinträge an, denen /bin/bash als Shell zugewiesen wurde.

root:x:0:0:root:/root:/bin/bash

(Hinweis: Ihre Ausgabe kann variieren, falls andere Benutzer auf dem System ebenfalls die Bash als Standard-Shell verwenden.)

Durch den Einsatz der Anker ^ und $ können Sie Ihre Suchergebnisse erheblich einschränken, um genau das zu finden, was Sie suchen.

Muster mit einfachen regulären Ausdrücken abgleichen

In diesem Schritt erkunden Sie, wie Sie einfache reguläre Ausdrücke (Basic Regular Expressions, BRE) mit grep verwenden, um flexiblere Suchmuster zu erstellen. In BRE haben bestimmte Zeichen, sogenannte Metazeichen, spezielle Bedeutungen, die über ihren literalen Wert hinausgehen. Dies ermöglicht es Ihnen, Muster statt nur fester Zeichenfolgen zu suchen.

Wir schauen uns zwei grundlegende Metazeichen an: * (Sternchen) und . (Punkt).

Untersuchen wir zuerst das Sternchen (*). Dieses Metazeichen entspricht dem unmittelbar vorangehenden Zeichen null oder beliebig oft. Um dies in Aktion zu sehen, führen Sie den folgenden Befehl aus. Wir setzen das Muster in einfache Anführungszeichen ('roo*'), um sicherzustellen, dass die Shell es als literales Muster behandelt und nicht versucht, das * als Platzhalter für Dateinamen zu interpretieren.

grep 'roo*' /etc/passwd

Die Ausgabe wird wahrscheinlich mehrere Zeilen zeigen:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Analysieren wir dieses Ergebnis. Das Muster 'roo*' sucht nach Zeilen, die ro enthalten, gefolgt von null oder mehr os.

  • Die root-Zeile passt, da sie roo enthält (ro gefolgt von einem o).
  • Die proxy-Zeile passt, da sie ro enthält (ro gefolgt von null os) im Wort "proxy".
  • Die systemd-timesync-Zeile passt, da sie ro in "Synchronization" enthält.
  • Die rtkit-Zeile passt, da sie ro in "proc" enthält.
  • Die operator-Zeile passt, da sie ro sowohl in "operator" als auch in "/root" enthält.

Schauen wir uns nun das Punkt-Metazeichen (.) an. Der Punkt entspricht genau einem beliebigen Zeichen. Führen Sie den folgenden Befehl aus, um den Unterschied zu sehen:

grep 'ro.' /etc/passwd

Diesmal zeigt die Ausgabe verschiedene Treffer:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Das Muster 'ro.' sucht nach Zeilen, die ro enthalten, gefolgt von genau einem beliebigen Zeichen.

  • Die root-Zeile passt, weil auf ro ein o in "root" folgt.
  • Die proxy-Zeile passt, weil auf ro ein x in "proxy" folgt.
  • Die systemd-timesync-Zeile passt, weil auf ro ein n in "Synchronization" folgt.
  • Die rtkit-Zeile passt, weil auf ro ein c in "proc" folgt.
  • Die operator-Zeile passt, weil auf ro ein weiteres Zeichen in "operator" und "/root" folgt.

Durch den Vergleich der Ausgaben wird die Mächtigkeit regulärer Ausdrücke deutlich. Beide Muster 'roo*' und 'ro.' finden mehrere Zeilen, zeigen aber, wie unterschiedliche Metazeichen es Ihnen ermöglichen, Ihre Suche auf verschiedene Weise fein abzustimmen.

Erweiterte reguläre Ausdrücke für komplexe Suchen verwenden

In diesem Schritt lernen Sie, erweiterte reguläre Ausdrücke (Extended Regular Expressions, ERE) zu verwenden, um noch komplexere und leistungsfähigere Suchvorgänge durchzuführen. ERE bietet einen umfangreicheren Satz an Metazeichen als die einfachen regulären Ausdrücke (BRE). Um ERE zu aktivieren, können Sie den Befehl grep -E oder dessen traditionellen Alias egrep verwenden. Die Verwendung von grep -E ist der modernere und empfohlene Ansatz.

Erkunden wir zunächst die Quantifizierer. In ERE können Sie die genaue Anzahl der Wiederholungen eines Zeichens mit geschweiften Klammern {} angeben. Um beispielsweise jede Zeile zu finden, die genau zwei aufeinanderfolgende Kleinbuchstaben 'o' enthält, können Sie das Muster o{2} verwenden.

Führen Sie den folgenden Befehl aus. Wir setzen das Muster in einfache Anführungszeichen, um zu verhindern, dass die Shell die Sonderzeichen falsch interpretiert.

grep -E 'o{2}' /etc/passwd

Die Ausgabe zeigt mehrere Zeilen, die "oo" enthalten:

root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Dieser Befehl funktioniert, weil das Muster o{2} gezielt nach zwei aufeinanderfolgenden 'o'-Zeichen sucht, wie sie in "root", "spool" und anderen Einträgen vorkommen.

Als Nächstes schauen wir uns die Alternation (Oder-Verknüpfung) an. Diese leistungsstarke ERE-Funktion ermöglicht es Ihnen, nach einem von mehreren möglichen Mustern zu suchen, indem Sie das Pipe-Symbol | verwenden, das als 'ODER'-Operator fungiert.

Wenn Sie beispielsweise den Benutzerdatensatz für entweder root oder Root finden möchten (falls Sie sich bei der Großschreibung unsicher sind), könnten Sie den folgenden Befehl verwenden:

grep -E 'root|Root' /etc/passwd

Dieser Befehl sucht nach jeder Zeile, die entweder die Zeichenfolge root oder die Zeichenfolge Root enthält. Die Ausgabe zeigt:

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Sowohl die Zeile des Benutzers root als auch die Zeile von operator passen, da beide die kleingeschriebene Zeichenfolge "root" enthalten.

Erweiterte reguläre Ausdrücke, die mit grep -E aktiviert werden, bieten eine ausdrucksstärkere und mächtigere Syntax für die Erstellung komplexer Suchmuster, was grep zu einem unverzichtbaren Werkzeug für die Textverarbeitung macht.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Befehl grep verwenden, um grundlegende Textsuchvorgänge unter Linux durchzuführen. Sie haben mit einfachen Suchen nach einer bestimmten Zeichenfolge in einer einzelnen Datei begonnen und dies dann auf die Suche in mehreren Dateien ausgeweitet, wobei Sie beobachtet haben, wie grep den passenden Zeilen die entsprechenden Dateinamen voranstellt. Außerdem haben Sie gelernt, die Option -n zu nutzen, um die Zeilennummer für jeden Treffer anzuzeigen, was beim Lokalisieren von Mustern in Dateien sehr hilfreich ist.

Darüber hinaus haben Sie fortgeschrittene Musterabgleich-Funktionen erkundet, indem Sie Anker verwendeten, um Text am Anfang (^) oder Ende ($) einer Zeile zu finden. Das Lab führte Sie weiter zur Verwendung von einfachen und erweiterten regulären Ausdrücken, was es Ihnen ermöglicht, komplexere und leistungsfähigere Suchmuster zu erstellen, um gezielte Informationen in Dateien zu finden.