grep, das ursprünglich für Unix-basierte Systeme entwickelt wurde, ist eines der am häufigsten verwendeten Befehlszeilen-Dienstprogramme in Linux-Systemen.
Sein Name leitet sich von einem anderen ähnlichen Befehl in ed tool ab, nämlich g/re/p, der für globalnacheinem regulärenAusdrucksuchen und übereinstimmende Zeilen ausgebensteht. grep sucht grundsätzlich nach einem bestimmten Muster oder regulären Ausdruck aus der Standardeingabe oder einer Datei und gibt die Zeilen aus, die den vorgegebenen Kriterien entsprechen. Es wird häufig verwendet, um unnötige Details herauszufiltern und nur die benötigten Informationen aus großen Protokolldateien auszugeben.
Die Leistungsfähigkeit des regulären Ausdrucks in Kombination mit den unterstützten Optionen in grep macht dies möglich.
Hier werden wir einige der häufig verwendeten grep-Befehle in verschiedenen Szenarien von Systemadministratoren oder Entwicklern behandeln.
Fangen wir also an…👨💻
grep Befehl Syntax
der Befehl grep erwartet ein Muster und optionale Argumente zusammen mit einer Dateiliste, wenn er ohne Piping verwendet wird.
$ grep [Optionen] Muster [Dateien]
Ein einfaches Beispiel ist:
$ grep meine_datei.txt
meine_datei
$
Mehrere Dateien durchsuchen
grep ermöglicht es Ihnen, nicht nur in einer, sondern in mehreren Dateien nach dem angegebenen Muster zu suchen. Hier sehen Sie, wie Sie mit dem Platzhalter *
in mehreren Dateien nach einem Muster suchen können.
$ sudo grep -i err /var/log/messages*
Ausgabe:
$ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Verwendung von IOAPIC für Interrupt-Routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Verwendung von IOAPIC für Interrupt-Routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Die Unterstützung der Boot Error Record Table ist deaktiviert. Aktivieren Sie sie mit bert_enable als Kernel-Parameter.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Die Unterstützung der Boot Error Record Table ist deaktiviert. Aktivieren Sie sie mit dem Kernel-Parameter bert_enable.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Host Log Nachricht konnte nicht gesendet werden.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Host-Protokollnachricht konnte nicht gesendet werden.
$
Aus der obigen Ausgabe können Sie ersehen, dass zuerst der Dateiname ausgegeben wird, bevor die passende Zeile gedruckt wird, um anzuzeigen, wo grep
das angegebene Muster gefunden hat.
Suche ohne Berücksichtigung der Groß-/Kleinschreibung
grep bietet die Möglichkeit, ein Muster zu suchen, ohne die Groß- und Kleinschreibung zu berücksichtigen. Verwenden Sie das Flag -i
, um grep anzuweisen, die Groß- und Kleinschreibung zu ignorieren.
$ grep -i [Muster] [Datei]
Ausgabe:
$ grep -i es text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
funktionalität. Sie können grep immer mit jeder Art von Daten verwenden
art von Daten verwenden, aber es funktioniert am besten mit Textdaten.
Es unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Ganzes Wort suchen
Nicht immer wollen wir eine Teilübereinstimmung, sondern wir erwarten, dass grep nur ein komplettes Wort findet. Das können Sie mit dem Flag -w
erreichen.
$ grep -w [Muster] [Datei]
Ausgabe:
$ grep -w ist text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Anzahl der Übereinstimmungen prüfen
Manchmal benötigen wir statt der tatsächlich gefundenen Zeile nur die Anzahl der erfolgreichen Treffer, die grep erzielt hat. Diese Anzahl können wir mit der Option -c
ermitteln.
$ grep -c [Muster] [Datei]
Ausgabe:
$ grep -c ist text_datei.txt
2
$
Unterverzeichnisse durchsuchen
Oft ist es erforderlich, Dateien nicht nur im aktuellen Arbeitsverzeichnis, sondern auch in Unterverzeichnissen zu suchen. grep ermöglicht Ihnen dies ganz einfach mit dem Flag -r
.
$ grep -r [Muster] *
Ausgabe:
$ grep -r Hallo *
dir1/file1.txt:Hallo Eins
dir1/file2.txt:Hallo Zwei
dir1/file3.txt:Guten Tag Drei
$
Wie Sie sehen können, durchläuft grep jedes Unterverzeichnis innerhalb des aktuellen Verzeichnisses und listet die Dateien und Zeilen auf, in denen eine Übereinstimmung gefunden wird.
Umgekehrte Suche
Wenn Sie etwas finden möchten, das nicht mit einem bestimmten Muster übereinstimmt, können Sie dies mit grep und der Option -v
tun.
$ grep -v [Muster] [Datei]
Ausgabe:
$ grep Diese text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$ grep -v Diese text_datei.txt
mehrere Zeilen, die zum Testen der grep
funktionalität. Sie können grep immer mit jeder Art von Daten verwenden
art von Daten verwenden, aber es funktioniert am besten mit Textdaten.
Es unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
alphabete und Sonderzeichen wie - * # usw.
$
Sie können die Ausgabe des Befehls grep
für dasselbe Muster und dieselbe Datei mit und ohne die Option -v
vergleichen. Mit -v
werden alle Zeilen, die nicht mit dem Muster übereinstimmen, ausgegeben.
Zeilennummern drucken
mit grep können Sie Zeilennummern zusammen mit den gedruckten Zeilen ausgeben, so dass Sie leicht erkennen können, wo sich die Zeile in der Datei befindet. Verwenden Sie die Option -n
wie gezeigt, um Zeilennummern in der Ausgabe zu erhalten.
$ grep -n [Muster] [Datei]
Ausgabe:
$ grep -n Diese text_datei.txt
1:Dies ist eine Beispiel-Textdatei. Sie enthält
7:Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Limit grep Ausgabe
Bei großen Dateien wie z.B. Protokollen usw. kann die grep-Ausgabe sehr lang sein und Sie brauchen vielleicht nur eine bestimmte Anzahl von Zeilen in der Ausgabe, anstatt alles zu finden. Wir können -m[num]
verwenden, um die gedruckten Zeilen nach der Anzahl der Zeilen zu begrenzen. So verwenden Sie es:
$ grep -m[num] [Muster] [Datei]
Beachten Sie, wie sich die Verwendung des Flags -m
auf die Ausgabe von grep für die gleichen Bedingungen im folgenden Beispiel auswirkt:
$ grep Es text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Sie unterstützt Zahlen wie 1, 2, 3 usw. sowie
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$ grep -m2 Es text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Sie unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
$
Zusätzliche Zeilen anzeigen
Oft benötigen wir nicht nur die Zeilen, die ein übereinstimmendes Muster aufweisen, sondern auch einige Zeilen darüber oder darunter, um den Kontext zu verbessern.
Es ist möglich, eine Zeile über oder unter (oder beide) einer Zeile mit einem Muster mit grep auszugeben, indem Sie die Flags -A
, -B
oder -C
mit dem Wert num
verwenden. Dabei steht num
für die Anzahl der zusätzlichen Zeilen, die oberhalb oder unterhalb der übereinstimmenden Zeile ausgegeben werden sollen. Dies gilt für alle Treffer, die grep in der angegebenen Datei oder Dateiliste findet.
$ grep -A[num] [Muster] [Datei]
OR
$ grep -B[num] [muster] [datei ]
ODER
$ grep -C[num] [muster] [datei ]
Die folgende Ausgabe zeigt sowohl eine normale grep-Ausgabe als auch eine Ausgabe mit den Flags -A
, -B
und -C
nacheinander. Beachten Sie, wie grep die Flags und ihre Werte interpretiert und welche Änderungen in der jeweiligen Ausgabe zu sehen sind. Mit dem Flag -A1
gibt grep 1 Zeile aus, die direkt auf die passende Zeile folgt.
Ähnlich verhält es sich mit dem Flag -B1
: Es wird 1 Zeile direkt vor der übereinstimmenden Zeile ausgegeben. Mit dem Flag -C1
wird 1 Zeile ausgegeben, die vor und nach der übereinstimmenden Zeile liegt.
$ grep Zahlen text_datei.txt
Es unterstützt auch Zahlen wie 1, 2, 3 usw. sowie
$ grep -A1 Zahlen text_datei.txt
Unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
alphabete und Sonderzeichen wie - * # usw.
$ grep -B1 Zahlen text_datei.txt
art von Daten, aber es funktioniert am besten mit Textdaten.
Es unterstützt Zahlen wie 1, 2, 3 usw. sowie
$ grep -C1 Zahlen text_datei.txt
art von Daten, aber es funktioniert am besten mit Textdaten.
Es unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
alphabete und Sonderzeichen wie - * # usw.
$
Dateinamen auflisten
Um nur die Namen der Dateien auszugeben, in denen ein Muster gefunden wurde, und nicht die tatsächlich übereinstimmenden Zeilen, verwenden Sie die Option -l
.
$ grep -l [Muster] [Datei]
Hier ist ein Beispiel:
$ grep -l su *.txt
datei.txt
text_datei.txt
$
Genaue Zeilen drucken
Manchmal müssen wir Zeilen ausgeben, die genau mit einem gegebenen Muster übereinstimmen, und nicht nur einen Teil davon. grep erlaubt das Flag -x
, um genau das zu tun.
$ grep -x [Muster] [Datei]
Im folgenden Beispiel enthält file.txt eine Zeile mit nur einem Wort “support” und wird als solche von grep mit dem Flag -x
durchsucht, während Zeilen, die das Wort “support” zusammen mit anderem Text enthalten, ignoriert werden.
$ grep -x unterstützung *.txt
datei.txt:unterstützung
$
Beginnende Zeichenkette abgleichen
Mit regulären Ausdrücken können wir eine Zeichenkette am Anfang einer Zeile finden. So geht’s.
$ grep [Optionen] "^[Zeichenfolge]" [Datei]
Beispiel:
$ grep Es text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Sie unterstützt Zahlen wie 1, 2, 3 usw. sowie
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$ grep ^It text_file.txt
Es unterstützt Zahlen wie 1, 2, 3 usw. sowie
$
Beachten Sie, wie die Verwendung des Zeichens ^
die Ausgabe verändert. ^
steht für den Anfang der Zeichenkette und grep hat ^It
als jede Zeile erkannt, die mit dem Wort It
beginnt. Das Einschließen in Anführungszeichen kann hilfreich sein, wenn das Muster Leerzeichen usw. enthält.
Ende der Zeichenkette abgleichen
Ein weiterer nützlicher regulärer Ausdruck ist der Abgleich mit dem Ende des Zeilenmusters.
$ grep [Optionen] "[Zeichenfolge]$" [Datei]
Beispiel:
$ grep "\." text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
funktionalität. Sie können grep immer mit jeder Art von Daten verwenden
art von Daten verwenden, aber es funktioniert am besten mit Textdaten.
Es unterstützt sowohl Zahlen wie 1, 2, 3 usw. als auch
alphabete und Sonderzeichen wie - * # usw.
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$ grep "\.$" text_file.txt
art von Daten, aber es funktioniert am besten mit Textdaten.
alphabete und Sonderzeichen wie - * # usw.
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Wir haben versucht, ein .
Zeichen am Ende der Zeile zu finden. Da der Punkt (.) ein Zeichen mit besonderer Bedeutung ist, müssen wir ihn mit einem \-Zeichen
ausschließen. Beachten Sie noch einmal, wie unterschiedlich die Ausgabe ist, wenn wir nur das Zeichen .
abgleichen und wenn wir $
verwenden, um grep anzuweisen, nur solche Zeilen abzugleichen, die mit .
enden (nicht die, die es irgendwo dazwischen enthalten können).
Musterdatei verwenden
Es kann Situationen geben, in denen Sie eine komplexe Liste von Mustern haben, die Sie häufig verwenden. Anstatt sie jedes Mal aufzuschreiben, können Sie eine Liste von Mustern in einer Datei angeben und mit dem Flag -f
verwenden. Die Datei sollte ein Muster pro Zeile enthalten.
$ grep -f [muster_datei] [datei_zu_treffen]
In unserem Beispiel haben wir eine Musterdatei namens pattern.txt
mit dem folgenden Inhalt erstellt:
$ cat muster.txt
Dies
Es
$
Um es zu verwenden, benutzen Sie die Flagge -f
.
$ grep -f muster.txt text_datei.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
Sie unterstützt Zahlen wie 1, 2, 3 usw. sowie
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Mehrere Muster angeben
grep erlaubt die Angabe von mehreren Mustern mit dem Flag -e
.
$ grep -e [Muster1] -e [Muster2] -e [Muster3]...[Datei]
Beispiel:
$ grep -e ist -e Es -e zu text_file.txt
Dies ist eine Beispiel-Textdatei. Sie enthält
mehrere Zeilen, die Sie zum Testen von grep verwenden können
Es unterstützt Zahlen wie 1, 2, 3 usw. sowie
Dies ist eine Beispiel-Textdatei. Sie wird zwei Mal wiederholt.
$
Erweiterte RegEx angeben
grep unterstützt auch Erweiterte Reguläre Ausdrücke oder ERE mit dem Flag -E
. Dies ist ähnlich wie der Befehl egrep
unter Linux.
Die Verwendung von ERE ist von Vorteil, wenn Sie Metazeichen als solche behandeln und nicht wie grep als Zeichenketten ersetzen möchten. Dies gibt Ihnen mehr Flexibilität, wenn es darum geht, sie zu escapen, wie es im Fall von grep erforderlich ist. Abgesehen davon ist die Verwendung von -E
mit grep gleichbedeutend mit dem Befehl egrep
.
$ grep -E '[Erweiterte RegEx]' [Datei]
Hier ist eine Anwendung von ERE, bei der wir Zeilen ausgeben wollen, die nicht kommentiert oder leer sind. Dies ist besonders nützlich, um etwas in großen Konfigurationsdateien zu finden. Ich habe zusätzlich das Flag -v
verwendet, um Zeilen, die dem Muster '^(#|$)'
entsprechen, NICHT auszugeben.
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostSchlüssel /etc/ssh/ssh_host_rsa_key
HostSchlüssel /etc/ssh/ssh_host_ecdsa_key
HostSchlüssel /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysDatei .ssh/authorized_keys
PasswortAuthentifizierung ja
ChallengeResponseAuthentifizierung nein
GSSAPIAuthentifizierung ja
GSSAPICleanupCredentials nein
UsePAM ja
X11Forwarding ja
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Untersystem sftp /usr/libexec/openssh/sftp-server
$
Fazit
Die obigen Beispiele sind nur die Spitze des Eisbergs. grep unterstützt eine Reihe von Optionen und kann ein sehr nützliches Werkzeug in der Hand einer Person sein, die weiß, wie man es effektiv einsetzt. Wir können nicht nur die oben genannten Beispiele verwenden, sondern sie auf verschiedene Weise kombinieren, um das zu bekommen, was wir brauchen.
Lesen Sie die man-Seite, um mehr darüber zu erfahren.
$ man grep
Als nächstes lernen Sie Beispiele für SFTP-Befehle kennen.