GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Grep-Befehl in Linux (Text in Dateien suchen)

Das grep Der Befehl steht für „Global Regular Expression Print“ und ist einer der leistungsstärksten und am häufigsten verwendeten Befehle in Linux.

grep durchsucht eine oder mehrere Eingabedateien nach Zeilen, die einem bestimmten Muster entsprechen, und schreibt jede übereinstimmende Zeile in die Standardausgabe. Wenn keine Dateien angegeben sind, grep liest von der Standardeingabe, die normalerweise die Ausgabe eines anderen Befehls ist.

In diesem Artikel zeigen wir Ihnen, wie Sie grep verwenden Befehl durch praktische Beispiele und detaillierte Erklärungen der gängigsten GNU grep Optionen.

grep Befehlssyntax #

Die Syntax für grep Befehl lautet wie folgt:

grep [OPTIONS] PATTERN [FILE...]

Die Angaben in eckigen Klammern sind optional.

  • OPTIONS - Null oder mehr Optionen. Grep enthält eine Reihe von Optionen, die sein Verhalten steuern.
  • PATTERN - Suchmuster.
  • FILE - Null oder mehr Eingabedateinamen.

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

Suche nach einer Zeichenfolge in Dateien #

Die einfachste Verwendung von grep Befehl ist, nach einer Zeichenkette (Text) in einer Datei zu suchen.

Zum Beispiel, um alle Zeilen anzuzeigen, die den String bash enthalten aus /etc/passwd Datei würden Sie den folgenden Befehl ausführen:

grep bash /etc/passwd

Die Ausgabe sollte in etwa 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 einschließen:

grep "Gnome Display Manager" /etc/passwd

Übereinstimmung umkehren (Ausschließen) #

Um die Linien anzuzeigen, die keinem Muster entsprechen, verwenden Sie -v ( oder --invert-match )-Option.

Zum Beispiel, um die Zeilen zu drucken, die nicht die Zeichenfolge nologin enthalten Sie würden 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

Verwenden von Grep zum Filtern der Ausgabe eines Befehls #

Die Ausgabe eines Befehls kann mit grep gefiltert werden durch Paspeln, und nur die Linien, die einem bestimmten Muster entsprechen, werden auf dem Terminal gedruckt.

Beispielsweise um als Benutzer www-data herauszufinden, welche Prozesse auf Ihrem System laufen Sie können den folgenden ps verwenden Befehl:

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 enthält Prozess. Wenn Sie nicht möchten, dass diese Zeile angezeigt wird, übergeben Sie die Ausgabe an ein anderes grep Beispiel wie unten gezeigt.

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
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

Um rekursiv nach einem Muster zu suchen, rufen Sie grep auf mit dem -r Option (oder --recursive ). Wenn diese Option verwendet wird grep durchsucht alle Dateien im angegebenen Verzeichnis und überspringt die symbolischen Links, auf die rekursiv gestoßen wird.

Um allen symbolischen Links zu folgen, statt -r verwenden Sie das -R Option (oder --dereference-recursive ).

Hier ist ein Beispiel, das zeigt, wie man nach der Zeichenfolge linuxize.com sucht in allen Dateien innerhalb von /etc Verzeichnis:

grep -r linuxize.com /etc

Die Ausgabe enthält übereinstimmende Zeilen, 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 das -R verwenden Option grep folgt allen symbolischen Links:

grep -R linuxize.com /etc

Beachten Sie die letzte Zeile der Ausgabe unten. Diese Zeile wird nicht gedruckt, wenn grep wird mit -r aufgerufen weil Dateien innerhalb der sites-enabled von Nginx Verzeichnis sind symbolische Links zu Konfigurationsdateien innerhalb der sites-available Verzeichnis.

/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;

Zeige nur den Dateinamen #

Um das Standard-grep zu unterdrücken nur die Namen der Dateien ausgeben und drucken, die das übereinstimmende Muster enthalten, verwenden Sie den -l ( oder --files-with-matches )-Option.

Der folgende Befehl durchsucht alle Dateien, die mit .conf enden im aktuellen Arbeitsverzeichnis und gibt nur die Namen der Dateien aus, die die Zeichenfolge linuxize.com enthalten :

grep -l linuxize.com *.conf

Die Ausgabe sieht in etwa so aus:

tmux.conf
haproxy.conf

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

grep -Rl linuxize.com /tmp

Standardmäßig grep unterscheidet zwischen Groß- und Kleinschreibung. Das bedeutet, dass Groß- und Kleinbuchstaben als unterschiedlich behandelt werden.

Um die Groß-/Kleinschreibung bei der Suche zu ignorieren, rufen Sie grep auf mit dem -i Option (oder --ignore-case ).

Beispielsweise bei der Suche nach Zebra ohne Option zeigt der folgende Befehl keine Ausgabe, d. h. es gibt übereinstimmende Zeilen:

grep Zebra /usr/share/words

Aber wenn Sie eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung mit -i durchführen Option, werden sowohl Groß- als auch Kleinbuchstaben gefunden:

grep -i Zebra /usr/share/words

Wenn Sie „Zebra“ angeben, wird „Zebra“, „ZEbrA“ oder jede andere Kombination aus Groß- und Kleinbuchstaben für diese Zeichenfolge gefunden.

zebra
zebra's
zebras

Suche nach ganzen Wörtern #

Wenn Sie nach einer Zeichenfolge suchen, grep zeigt alle Zeilen an, in denen der String in größere Strings eingebettet ist.

Wenn Sie beispielsweise nach „gnu“ suchen, werden alle Zeilen gefunden, 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

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

Wortzeichen umfassen alphanumerische Zeichen (a-z , A-Z , und 0-9 ) und Unterstriche (_ ). Alle anderen Zeichen werden als Nichtwortzeichen betrachtet.

Wenn Sie denselben Befehl wie oben ausführen, einschließlich -w Option, die grep Der Befehl gibt nur die Zeilen zurück, in denen gnu ist als separates Wort enthalten.

grep -w gnu /usr/share/words
gnu

Zeige Zeilennummern #

Das -n ( oder --line-number ) Option teilt grep mit um die Zeilennummer der Zeilen anzuzeigen, die eine Zeichenfolge enthalten, die einem Muster entspricht. Wenn diese Option verwendet wird, grep gibt die Übereinstimmungen mit vorangestellter Zeilennummer auf der Standardausgabe aus.

Zum Beispiel um die Zeilen aus /etc/services anzuzeigen Datei, die den String bash enthält mit vorangestellter passender Zeilennummer können Sie folgenden Befehl verwenden:

grep -n 10000 /etc/services

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

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

Übereinstimmungen zählen #

Um eine Anzahl übereinstimmender Zeilen auf der Standardausgabe auszugeben, verwenden Sie -c ( oder --count )-Option.

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

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

Leiser Modus #

Das -q (oder --quiet ) sagt grep im stillen Modus laufen, um nichts auf der Standardausgabe anzuzeigen. Wenn eine Übereinstimmung gefunden wird, wird der Befehl mit dem Status 0 beendet . Dies ist nützlich, wenn Sie grep verwenden B. in Shell-Skripten, in denen Sie prüfen möchten, ob eine Datei einen String enthält, und je nach Ergebnis eine bestimmte Aktion ausführen möchten.

Hier ist ein Beispiel für die Verwendung von grep in einem stillen Modus als Testbefehl in einem if Aussage:

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

Einfacher regulärer Ausdruck #

GNU Grep hat drei Feature-Sets für reguläre Ausdrücke, Basic, Extended und Perl-kompatibel.

Standardmäßig grep interpretiert das Muster als einfachen regulären Ausdruck, bei dem alle Zeichen außer den Metazeichen tatsächlich reguläre Ausdrücke sind, die mit sich selbst übereinstimmen.

Nachfolgend finden Sie eine Liste der am häufigsten verwendeten Metazeichen:

  • Verwenden Sie den ^ (Caret)-Symbol, um den Ausdruck am Anfang einer Zeile abzugleichen. Im folgenden Beispiel die Zeichenfolge kangaroo wird nur übereinstimmen, wenn es ganz am Anfang einer Zeile steht.

    grep "^kangaroo" file.txt
  • Verwenden Sie den $ (Dollar)-Symbol, um den Ausdruck am Ende einer Zeile abzugleichen. Im folgenden Beispiel die Zeichenfolge kangaroo wird nur übereinstimmen, wenn es ganz am Ende einer Zeile steht.

    grep "kangaroo$" file.txt
  • Verwenden Sie den . (Punkt) Symbol, um ein beliebiges einzelnes Zeichen zu finden. Zum Beispiel, um alles abzugleichen, was mit kan beginnt ist dann zweistellig und endet mit der Zeichenkette roo , könnten Sie das folgende Muster verwenden:

    grep "kan..roo" file.txt
  • Verwenden Sie [ ] (Klammern), um jedem einzelnen Zeichen zu entsprechen, das in Klammern eingeschlossen ist. Suchen Sie beispielsweise die Zeilen, die accept enthalten oder „accent , könnten Sie das folgende Muster verwenden:

    grep "acce[np]t" file.txt
  • Verwenden Sie [^ ] jedes einzelne Zeichen zu finden, das nicht in Klammern eingeschlossen ist. Das folgende Muster entspricht jeder Kombination von Zeichenfolgen, die co(any_letter_except_l)a enthalten , wie zum Beispiel coca , cobalt usw., stimmt aber nicht mit den Zeilen überein, die cola enthalten ,

    grep "co[^l]a" file.txt

Um die besondere Bedeutung des nächsten Zeichens zu umgehen, verwenden Sie den \ (Backslash)-Symbol.

Erweiterte reguläre Ausdrücke #

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

  • Vergleichen und extrahieren Sie alle E-Mail-Adressen aus einer bestimmten Datei:

    grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
  • Vergleichen und extrahieren Sie alle gültigen IP-Adressen aus einer bestimmten Datei:

    grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Das -o Option wird verwendet, um nur die passende Zeichenfolge zu drucken.

Suche nach mehreren Zeichenfolgen (Mustern) #

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

Standardmäßig grep interpretiert das Muster als einfachen regulären Ausdruck, bei dem die Metazeichen wie | ihre besondere Bedeutung verlieren und ihre Backslash-Versionen müssen verwendet werden.

Im folgenden Beispiel suchen wir nach allen Vorkommen der Wörter fatal , error und critical in der Nginx-Logerror-Datei:

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

Wenn Sie die erweiterte reguläre Ausdrucksoption -E verwenden , dann den Operator | sollte nicht maskiert werden, wie unten gezeigt:

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

Um eine bestimmte Anzahl von Zeilen vor übereinstimmenden Zeilen zu drucken, verwenden Sie -B ( oder --before-context )-Option.

Um beispielsweise fünf Zeilen führenden Kontext vor passenden Zeilen anzuzeigen, würden Sie den folgenden Befehl verwenden:

grep -B 5 root /etc/passwd

Um eine bestimmte Anzahl von Zeilen nach übereinstimmenden Zeilen zu drucken, verwenden Sie -A ( oder --after-context )-Option.

Um beispielsweise fünf Zeilen nachgestellten Kontext nach übereinstimmenden Zeilen anzuzeigen, würden Sie den folgenden Befehl verwenden:

grep -A 5 root /etc/passwd

Schlussfolgerung #

Das grep Mit dem Befehl können Sie innerhalb von Dateien nach einem Muster suchen. Wenn eine Übereinstimmung gefunden wird, gibt grep die Zeilen aus, die das angegebene Muster enthalten.

Es gibt noch viel mehr über Grep auf der Grep User’s Manualpage zu erfahren.

Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.


Linux
  1. 25 Nützliche praktische Beispiele für find-Befehle unter Linux

  2. So verwenden Sie den Grep-Befehl, um Text in Dateien zu finden

  3. So verwenden Sie den Linux-Befehl find zum Suchen von Dateien

  4. Linux-Befehl:Wie findet man nur Textdateien?

  5. Wie finde ich Textdateien, die keinen Text unter Linux enthalten?

So finden Sie Dateien mit dem fd-Befehl in Linux

Finden Sie Text in Dateien unter Linux mit grep

Tutorial für Linux-Suchbefehle (mit Beispielen)

So finden Sie Ordner in Linux

Grep-Befehl unter Linux/UNIX

ls-Befehl unter Linux/UNIX