Textsuche mit grep unter Linux

CompTIACompTIABeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Labor lernen Sie, wie Sie mit dem leistungsstarken Befehl grep effektiv nach Text in Dateien auf einem Linux-System suchen. Sie beginnen mit einfachen Suchen nach bestimmten Zeichenketten in einzelnen und mehreren Dateien und verstehen, wie grep übereinstimmende Zeilen anzeigt und die Quelldatei identifiziert, wenn über mehrere Speicherorte hinweg gesucht wird.

Aufbauend auf diesem Fundament erkunden Sie fortgeschrittenere Funktionen, um Ihre Suchen zu verfeinern. Sie lernen, Zeilennummern zur Kontextualisierung anzuzeigen, Anker wie ^ und $ zu verwenden, um Muster am Anfang oder Ende einer Zeile abzugleichen, und die Fähigkeiten sowohl grundlegender als auch erweiterter regulärer Ausdrücke zu nutzen, um komplexe und flexible Musterabgleiche durchzuführen.

Grundlegende Suche in Dateien mit grep durchführen

In diesem Schritt lernen Sie die grundlegende Verwendung des Befehls grep für einfache Suchen in Dateien. Der Befehl grep (Global Regular Expression Print) ist ein leistungsstarkes Kommandozeilen-Dienstprogramm, das verwendet wird, um nach einer bestimmten Zeichenkette oder einem Muster in einer oder mehreren Dateien zu suchen und die Zeilen anzuzeigen, die diese enthalten.

Die grundlegende Syntax für grep lautet: grep MUSTER [DATEI...]

Beginnen wir mit einer einfachen Aufgabe: Informationen über unseren aktuellen Benutzer, labex, in der Benutzerdatenbankdatei des Systems zu finden. Diese Informationen sind in der Datei /etc/passwd gespeichert.

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

grep labex /etc/passwd

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

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

Der Befehl grep kann auch gleichzeitig über mehrere Dateien hinweg suchen. Wir werden nun nach der Zeichenkette labex in drei wichtigen Systemkonfigurationsdateien suchen: /etc/passwd, /etc/shadow (die sichere Benutzerkontoinformationen speichert) und /etc/group (die Benutzergruppen definiert).

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 für den passwortlosen sudo-Zugriff konfiguriert.

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 übereinstimmenden Zeile den Namen der Datei voranstellt, in der die Übereinstimmung 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 sich auf den Benutzer labex beziehen.

Zeilennummern mit der Option -n anzeigen

In diesem Schritt lernen Sie, wie Sie die Ausgabe von grep verbessern können, indem Sie die Zeilennummern anzeigen, bei denen Übereinstimmungen gefunden werden. Dies ist besonders nützlich, wenn Sie ein Muster in einer großen Datei zur Bearbeitung oder weiteren Analyse lokalisieren müssen. Die Option -n weist grep an, jede Ausgabenzeile mit ihrer entsprechenden Zeilennummer aus der Eingabedatei zu versehen.

Aufbauend auf dem Befehl aus dem vorherigen Schritt. Sie haben nach dem Benutzer labex in drei Systemdateien gesucht. Nun führen Sie dieselbe Suche durch, zeigen aber auch die Zeilennummern für jede Übereinstimmung an.

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 immer noch auf die eingeschränkte 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 nun ist jeder Zeile der Dateiname und die Zeilennummer, bei der die Übereinstimmung aufgetreten ist, 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

Beachten Sie die Zahlen wie 32, 32, 21, 60, 61 und 62 in der Ausgabe. Dies sind die Zeilennummern. Zum Beispiel wurde die Zeichenkette labex in Zeile 32 von /etc/passwd und Zeile 32 von /etc/shadow gefunden. Diese einfache Option macht grep zu einem noch effektiveren Werkzeug für die Navigation und das Verständnis von Dateiinhalten.

Zeilenposition mit den Ankern ^ und $ abgleichen

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

  • ^ (Zirkumflex): Gleicht den Anfang einer Zeile ab.
  • $ (Dollarzeichen): Gleicht das Ende einer Zeile ab.

Sehen wir uns an, wie diese mit der Datei /etc/passwd funktionieren.

Betrachten Sie zunächst eine einfache Suche nach der Zeichenkette root in /etc/passwd:

grep root /etc/passwd

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

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

Lassen Sie uns dies nun verfeinern. In der Datei /etc/passwd ist das erste Feld jedes Datensatzes der Benutzername. Um den Benutzerdatensatz speziell für den Benutzer root zu finden, können Sie Ihre Suche mit ^ am Anfang der Zeile verankern.

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

grep ^root /etc/passwd

Diesmal ist die Ausgabe viel spezifischer 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 verwenden, um alle Benutzer zu finden, die /bin/bash als ihre Standard-Shell haben.

Das Muster bash$ gleicht jede Zeile ab, die mit der Zeichenkette bash endet.

grep bash$ /etc/passwd

Dieser Befehl zeigt alle Benutzereinträge an, bei denen /bin/bash die zugewiesene Shell ist.

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

(Hinweis: Ihre Ausgabe kann variieren, wenn andere Benutzer im System ebenfalls bash als ihre Standard-Shell verwenden.)

Durch die Verwendung der Anker ^ und $ können Sie Ihre Suchergebnisse erheblich eingrenzen, um genau das zu finden, wonach Sie suchen.

Muster mit Basis-Regulären Ausdrücken abgleichen

In diesem Schritt erfahren Sie, wie Sie Basis-Reguläre Ausdrücke (BRE) mit grep verwenden, um flexiblere Suchmuster zu erstellen. In BRE haben bestimmte Zeichen, sogenannte Metazeichen, spezielle Bedeutungen, die über ihren wörtlichen Wert hinausgehen. Dies ermöglicht es Ihnen, Muster und nicht nur feste Zeichenketten abzugleichen.

Wir werden zwei grundlegende Metazeichen untersuchen: * (Sternchen) und . (Punkt).

Betrachten wir zunächst das Sternchen (*). Dieses Metazeichen gleicht das unmittelbar davor stehende Zeichen null- oder mehrmals ab. Um dies in Aktion zu sehen, führen Sie den folgenden Befehl aus. Wir werden das Muster in einfache Anführungszeichen ('roo*') einschließen, um sicherzustellen, dass die Shell es als wörtliches Muster behandelt und nicht versucht, * als Dateiwildcard zu erweitern.

grep 'roo*' /etc/passwd

Die Ausgabe wird wahrscheinlich mehrere Zeilen anzeigen:

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 gefolgt von null oder mehr o's enthalten.

  • Die Zeile root passt, da sie roo enthält (ro gefolgt von einem o).
  • Die Zeile proxy passt, da sie ro enthält (ro gefolgt von null o's) in "proxy".
  • Die Zeile systemd-timesync passt, da sie ro in "Synchronization" enthält.
  • Die Zeile rtkit passt, da sie ro in "proc" enthält.
  • Die Zeile operator passt, da sie ro in "operator" und "/root" enthält.

Betrachten wir nun das Metazeichen Punkt (.). Der Punkt gleicht jedes einzelne Zeichen ab. Führen Sie den folgenden Befehl aus, um zu sehen, wie sich sein Verhalten unterscheidet:

grep 'ro.' /etc/passwd

Diesmal zeigt die Ausgabe mehrere Übereinstimmungen:

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 gefolgt von genau einem beliebigen Zeichen enthalten.

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

Durch den Vergleich der Ausgaben können Sie die Leistungsfähigkeit regulärer Ausdrücke klar erkennen. Sowohl die Muster 'roo*' als auch 'ro.' passen zu mehreren Zeilen und zeigen, wie verschiedene Metazeichen es Ihnen ermöglichen, Ihre Suchen auf unterschiedliche Weise fein abzustimmen.

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

In diesem Schritt lernen Sie, erweiterte reguläre Ausdrücke (ERE) zu verwenden, um noch komplexere und leistungsfähigere Suchen durchzuführen. ERE bietet einen reichhaltigeren Satz von Metazeichen als Basis-Reguläre 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.

Zuerst untersuchen wir Quantifizierer. In ERE können Sie mit geschweiften Klammern {} die genaue Anzahl angeben, wie oft ein Zeichen vorkommen soll. Um beispielsweise jede Zeile zu finden, die genau zwei Kleinbuchstaben 'o' hintereinander enthält, können Sie das Muster o{2} verwenden.

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

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

Die Ausgabe zeigt mehrere Zeilen an, 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, da das Muster o{2} spezifisch zwei aufeinanderfolgende 'o'-Zeichen abgleicht, die in "root", "spool" und anderen Einträgen gefunden werden.

Als Nächstes betrachten wir die Alternation. Dieses leistungsstarke ERE-Feature ermöglicht es Ihnen, nach einem von mehreren möglichen Mustern mithilfe des Pipe-Symbols | zu suchen, das als 'ODER'-Operator fungiert.

Wenn Sie beispielsweise nach einem Benutzereintrag für entweder root oder Root suchen möchten (falls Sie sich bei der Groß-/Kleinschreibung nicht sicher waren), könnten Sie den folgenden Befehl verwenden:

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

Dieser Befehl sucht nach jeder Zeile, die entweder die Zeichenkette root oder die Zeichenkette 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 operator passen, da beide die Kleinbuchstaben-Zeichenkette "root" enthalten.

Erweiterte reguläre Ausdrücke, aktiviert mit grep -E, bieten eine ausdrucksstärkere und leistungsfähigere Syntax zum Erstellen komplexer Suchmuster und machen grep zu einem unverzichtbaren Werkzeug für die Textverarbeitung.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Befehl grep verwenden, um grundlegende Textsuchvorgänge in Linux durchzuführen. Sie haben mit der Ausführung einfacher Suchen nach einer bestimmten Zeichenkette in einer einzelnen Datei begonnen und dies dann auf die Suche über mehrere Dateien erweitert, wobei Sie beobachtet haben, wie grep übereinstimmende Zeilen mit den entsprechenden Dateinamen versieht. Sie haben auch die Option -n kennengelernt, um die Zeilennummer für jede Übereinstimmung anzuzeigen, was für die Lokalisierung von Mustern in Dateien nützlich ist.

Darüber hinaus haben Sie fortgeschrittenere Musterabgleichfähigkeiten durch die Verwendung von Ankern erkundet, um Text am Anfang (^) oder Ende ($) einer Zeile zu finden. Das Lab wurde fortgesetzt, um die Verwendung von Basis- und erweiterten regulären Ausdrücken abzudecken, wodurch Sie komplexere und leistungsfähigere Suchmuster erstellen können, um spezifische Informationen in Dateien zu finden.