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
Rekursive Suche #
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 Suche ohne Berücksichtigung der Groß-/Kleinschreibung
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.
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 Zeichenfolgekangaroowird 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 Zeichenfolgekangaroowird 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 mitkanbeginnt ist dann zweistellig und endet mit der Zeichenketteroo, 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, dieacceptenthalten 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, dieco(any_letter_except_l)aenthalten , wie zum Beispielcoca,cobaltusw., stimmt aber nicht mit den Zeilen überein, diecolaenthalten ,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 Zeilen vor einem Match drucken #
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 Zeilen nach einem Match drucken #
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.