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 expression
grep -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 Zeichenfolgekangaroo
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 Zeichenfolgekangaroo
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 mitkan
beginnt 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, dieaccept
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, dieco(any_letter_except_l)a
enthalten , wie zum Beispielcoca
,cobalt
usw., stimmt aber nicht mit den Zeilen überein, diecola
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
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.