Android

Grep Befehl in Linux (finde Text in Dateien)

Grep - Dateiinhalte suchen und finden in Linux - Ubuntu [Deutsch/German]

Grep - Dateiinhalte suchen und finden in Linux - Ubuntu [Deutsch/German]

Inhaltsverzeichnis:

Anonim

Der Befehl grep der für "global regular expression print" steht, ist einer der leistungsstärksten und am häufigsten verwendeten Befehle unter Linux.

Grep sucht eine oder mehrere Eingabedateien für Linien, die ein bestimmtes Muster entsprechen und schreiben auf der Standardausgabe jede passende Zeile. Wenn keine Dateien angegeben sind, liest grep von der Standardeingabe, die normalerweise die Ausgabe eines anderen Befehls ist.

In diesem Tutorial zeigen wir Ihnen grep von praktischen Beispielen und detaillierten Erklärungen der gebräuchlichsten GNU grep Optionen, wie Sie den Befehl grep .

Grep-Befehlssyntax

Bevor wir mit der Verwendung des Befehls grep beginnen, überprüfen wir zunächst die grundlegende Syntax.

Die grep Dienstprogrammausdrücke haben die folgende Form:

grep PATTERN

Die Elemente in eckigen Klammern sind optional.

  • OPTIONS - OPTIONS oder mehr Optionen. Grep bietet eine Reihe von Optionen, die sein Verhalten steuern. PATTERN - Suchmuster. FILE - Keine oder mehrere Eingabedateinamen.

Um die Datei durchsuchen zu können, muss der Benutzer, der den Befehl ausführt, Lesezugriff auf die Datei haben.

So verwenden Sie grep zum Suchen nach einer Zeichenfolge in Dateien

Die einfachste Verwendung des Befehls grep ist die Suche nach einer Zeichenfolge (Text) in einer Datei.

Um zum Beispiel die Linien von der zum Anzeigen /etc/passwd - Datei die Zeichenfolge enthält bash Sie den folgenden Befehl verwenden:

grep bash /etc/passwd

Die Ausgabe sollte ungefähr so ​​aussehen:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Wenn die Zeichenfolge Leerzeichen enthält, müssen Sie sie in einfache oder doppelte Anführungszeichen setzen:

grep "Gnome Display Manager" /etc/passwd

Treffer invertieren (ausschließen)

Um die Linien angezeigt werden, die nicht mit einem Muster übereinstimmen, verwenden Sie die -v (oder --invert-match ) Option.

Um beispielsweise die Zeilen aus der Datei /etc/passwd anzuzeigen, die den String nologin nicht enthalten, nologin Sie den folgenden Befehl verwenden:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Verwendung von Grep zur Suche nach einer Zeichenfolge in der Befehlsausgabe

Anstatt Eingabedateien anzugeben, können Sie die Ausgabe eines anderen Befehls an grep und dann nur Zeilen anzeigen, die mit einem bestimmten Muster übereinstimmen.

Um beispielsweise herauszufinden, welche Prozesse auf Ihrem System als Benutzer- www-data , können Sie den folgenden Befehl ps :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Sie können auch mehrere Pipes auf Befehl verketten. Wie Sie in der obigen Ausgabe sehen können, gibt es auch eine Zeile, die den grep Prozess enthält. Wenn diese Zeile nicht angezeigt werden soll, leiten Sie die Ausgabe wie unten gezeigt an eine andere grep Instanz weiter.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

rekursive Suche

Verwenden Sie zum rekursiven Suchen nach einem Muster die Option -r (oder --recursive ). Dadurch werden alle Dateien im angegebenen Verzeichnis durchsucht und die rekursiv gefundenen Symlinks übersprungen. Verwenden Sie die Option -R (oder --dereference-recursive ), um allen symbolischen Links zu folgen.

Im folgenden Beispiel suchen wir in allen Dateien im Verzeichnis /etc nach der Zeichenfolge linuxize.com :

grep -r linuxize.com /etc

Der Befehl gibt die übereinstimmenden Zeilen aus, denen der vollständige Pfad zur Datei vorangestellt ist.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Wenn Sie stattdessen die Option -r verwenden, folgt grep allen symbolischen Links:

grep -R linuxize.com /etc

Beachten Sie die letzte Zeile der Ausgabe. Diese Zeile wird im obigen Beispiel nicht gedruckt, da Dateien im sites-enabled Verzeichnis von Nginx symbolische Links zu Konfigurationsdateien im sites-available Verzeichnis sind.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Nur Anzeigen der Dateiname

Um die Standard- grep Ausgabe zu unterdrücken und nur die Namen von Dateien mit dem passenden Muster zu drucken, können Sie die Option -l (oder --files-with-matches ) verwenden.

Um zum Beispiel alle Dateien zu durchsuchen, die mit .conf im aktuellen Arbeitsverzeichnis enden, und nur die Namen von Dateien zu drucken, die den String linuxize.com enthalten, geben Sie linuxize.com :

grep -l linuxize.com *.conf

Die Ausgabe sieht ungefähr so ​​aus:

tmux.conf haproxy.conf

Die Option -l wird normalerweise in Kombination mit der rekursiven Option -R :

grep -Rl linuxize.com /tmp

Suche ohne Berücksichtigung der Groß- / Kleinschreibung

Standardmäßig unterscheidet der Befehl grep Groß- und Kleinschreibung. Dies bedeutet, dass Groß- und Kleinbuchstaben als unterschiedlich behandelt werden.

Verwenden Sie die Option -i (oder --ignore-case ), um die Groß- / Kleinschreibung bei der Suche zu ignorieren.

Wenn Sie beispielsweise ohne Option nach Zebra suchen, zeigt der folgende Befehl keine Ausgabe an, dh es gibt übereinstimmende Zeilen:

grep Zebra /usr/share/words

Wenn Sie jedoch eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung mit der Option -i , werden sowohl Groß- als auch Kleinbuchstaben berücksichtigt:

grep -i Zebra /usr/share/words

Die Angabe von „Zebra“ entspricht „Zebra“, „ZEbrA“ oder einer anderen Kombination von Groß- und Kleinbuchstaben für diese Zeichenfolge.

zebra zebra's zebras

Suche nach vollständigen Wörtern

Bei der Suche nach "gnu" druckt grep auch die Zeilen, in denen "gnu" in größere Wörter wie "cygnus" oder "magnum" eingebettet ist.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Verwenden Sie die Option -w (oder --word-regexp ), um nur die Zeilen zurückzugeben, in denen die angegebene Zeichenfolge ein ganzes Wort (eingeschlossen von Nicht-Wort-Zeichen) ist.

Wortzeichen umfassen alphanumerische Zeichen ( az , AZ und 0-9 ) und Unterstriche ( _ ). Alle anderen Zeichen werden als Nichtwortzeichen betrachtet.

grep -w gnu /usr/share/words

gnu

Zeilennummern anzeigen

Verwenden Sie die Option -n (oder --line-number ), um die Anzahl der Zeilen --line-number die eine Zeichenfolge enthalten, die einem Muster entspricht. Bei Verwendung dieser Option druckt grep die Übereinstimmungen mit der Standardausgabe, der die Zeilennummer vorangestellt ist, auf der sie gefunden wurde.

Um beispielsweise die Zeilen aus der Datei /etc/services anzuzeigen, in der die Zeichenfolge bash mit der entsprechenden Zeilennummer vorangestellt ist, können Sie den folgenden Befehl verwenden:

grep -n 10000 /etc/services

Die folgende Ausgabe zeigt uns, dass die Übereinstimmungen in den Zeilen 10423 und 10424 gefunden werden.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Zähle Übereinstimmungen

Verwenden Sie die Option -c (oder --count ), um die Anzahl der übereinstimmenden Zeilen für die Standardausgabe zu drucken.

Im Beispiel unten, zählen wir die Anzahl der Konten, die haben /usr/bin/zsh als Shell.

grep -c '/usr/bin/zsh' /etc/passwd

4

Suche nach mehreren Strings (Patterns)

Zwei oder mehr Suchmuster können mit dem Operator OR | verknüpft werden.

Standardmäßig interpretiert grep das Muster als einfachen regulären Ausdruck, in dem die Metazeichen wie | verlieren ihre besondere Bedeutung, und ihre Versionen mit umgekehrten Schrägstrichen müssen verwendet werden.

Im Beispiel unten wir alle Vorkommen der Wörter suchen fatal , error und critical in der Nginx Protokollfehlerdatei:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Ruhemodus

Die -q (oder --quiet ) erzählt grep nicht schreiben etwas an das Endgerät (Standardausgabe). Wird eine Übereinstimmung gefunden, wird der Befehl mit dem Status 0 . Dies ist nützlich, wenn Sie grep in Shellskripten verwenden, bei denen Sie überprüfen möchten, ob eine Datei eine Zeichenfolge enthält, und abhängig vom Ergebnis eine bestimmte Aktion ausführen möchten.

Hier ist ein Beispiel für die Verwendung von grep im stillen Modus als Testbefehl in einer if Anweisung:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Grundlegender regulärer Ausdruck

GNU Grep verfügt über zwei Funktionssätze für reguläre Ausdrücke, Basic und Extended. Standardmäßig interpretiert grep das Muster als einfachen regulären Ausdruck.

Wenn in einfachen regulären Ausdruck Modus verwendet, alle anderen Zeichen mit Ausnahme der Meta-Zeichen sind eigentlich reguläre Ausdrücke, die sich entsprechen. Nachfolgend finden Sie eine Liste der am häufigsten verwendeten Metazeichen:

  • Verwenden Sie das Symbol ^ (Caret), um den Ausdruck am Zeilenanfang abzugleichen. Im folgende Beispiel wird die Zeichenfolge ^kangaroo nur überein, wenn es am Anfang einer Zeile auftritt.

    grep "^kangaroo" file.txt

    Verwenden Sie das Symbol $ (Dollar), um den Ausdruck am Ende einer Zeile abzugleichen. Im folgenden Beispiel wird die Zeichenfolge kangaroo$ wird nur überein, wenn es am Ende einer Zeile auftritt.

    grep "kangaroo$" file.txt

    Verwenden Sie die . (Punkt-) Symbol für ein beliebiges einzelnes Zeichen. Um beispielsweise eine Übereinstimmung zu finden, die mit kan beginnt, dann zwei Zeichen hat und mit der Zeichenfolge roo endet, können Sie das folgende Muster verwenden:

    grep "kan..roo" file.txt

    Verwenden (eckige Klammern), um einem einzelnen Zeichen in den Klammern zu entsprechen. Suchen Sie beispielsweise nach den Zeilen, die " accept " oder " accent " enthalten, können Sie das folgende Muster verwenden:

    grep "accet" file.txt

    Verwenden (eckige Klammern), um einem einzelnen Zeichen in den Klammern zu entsprechen. Das folgende Muster co(any_letter_except_l)a beliebigen Kombination von Zeichenfolgen co(any_letter_except_l)a die co(any_letter_except_l)a , z. B. coca , cobalt usw., co(any_letter_except_l)a jedoch nicht mit den Zeilen überein, die cola enthalten.

    grep "coa" file.txt

Verwenden Sie das Symbol \ (Backslash), um die spezielle Bedeutung des nächsten Zeichens zu umgehen.

Erweiterte reguläre Ausdrücke

Um das Muster als erweiterte regulären Ausdruck zu interpretieren, verwenden Sie die -E (oder --extended-regexp ) Option. Erweiterte reguläre Ausdrücke enthalten alle grundlegenden Metazeichen sowie zusätzliche Metazeichen, um komplexere und leistungsfähigere Suchmuster zu erstellen. Im Folgenden sind einige Beispiele:

  • Alle E-Mail-Adressen aus einer bestimmten Datei abgleichen und extrahieren:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Entspricht und extrahiert alle gültigen IP-Adressen aus einer bestimmten Datei:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Die Option -o wird verwendet, um nur die übereinstimmende Zeichenfolge zu drucken.

Zeilen vor einer Übereinstimmung drucken

Verwenden Sie die Option -B (oder --before-context ), um eine bestimmte Anzahl von Zeilen vor dem Abgleichen von Zeilen zu drucken.

Um beispielsweise fünf Zeilen des führenden Kontexts anzuzeigen, bevor sie übereinstimmen, verwenden Sie den folgenden Befehl:

grep -B 5 root /etc/passwd

Zeilen nach einer Übereinstimmung drucken

Verwenden Sie die Option -A (oder --after-context ), um eine bestimmte Anzahl von Zeilen nach dem Abgleichen von Zeilen zu drucken.

Um beispielsweise fünf Zeilen des nachgestellten Kontexts nach übereinstimmenden Zeilen anzuzeigen, verwenden Sie den folgenden Befehl:

grep -A 5 root /etc/passwd

Fazit

Mit dem Befehl grep können Sie in Dateien nach einem Muster suchen. Wenn eine Übereinstimmung gefunden wird, druckt grep die Zeilen, die das angegebene Muster enthalten.

Auf der Handbuchseite von Grep finden Sie weitere Informationen zu Grep.

grep terminal