grep

30 Grep-Beispiele

30 Grep-Beispiele
Sie können grep tief im tierischen Gehirn von Unix und Unix-ähnlichen Betriebssystemen finden. Es ist ein grundlegendes Programm für den Mustervergleich und wurde in den 70er Jahren zusammen mit dem Rest des UNIX-Tools geschrieben, das wir kennen und lieben (oder hassen).

Während das Erlernen von formalen Sprachen und regulären Ausdrücken ein spannendes Thema ist. Das Erlernen von Grep hat viel mehr zu bieten als Regexes. Um damit anzufangen und die Schönheit und Eleganz von grep zu sehen, müssen Sie zuerst einige Beispiele aus der realen Welt sehen.

Beispiele, die praktisch sind und Ihnen das Leben ein wenig erleichtern. Hier sind 30 solcher allgemeiner Anwendungsfälle und Optionen für grep.

1. ps aux | grep

Die ps aux listet alle Prozesse und ihre zugehörigen pids auf. Aber oft ist diese Liste zu lang, als dass ein Mensch sie inspizieren könnte. Wenn Sie die Ausgabe an einen grep-Befehl weiterleiten, können Sie Prozesse auflisten, die mit einer ganz bestimmten Anwendung im Hinterkopf ausgeführt werden. Zum Beispiel die könnte sshd oder nginx oder httpd sein.

# ps aux | grep sshd
root    400  0.0  0.2  69944  5624 ?       Ss   17:47   0:00 /usr/sbin/sshd -D
root   1076  0.2  0.3  95204  6816 ?       Ss   18:29   0:00 sshd: root@pts/0
root   1093  0.0  0.0  12784  932 Pkt./0    S+   18:29   0:00 grep sshd

2. Zugriff auf Ihre IP-Adressen

In den meisten Betriebssystemen können Sie alle Ihre Netzwerkschnittstellen und die dieser Schnittstelle zugewiesene IP auflisten, indem Sie entweder den Befehl ifconfig oder ip addr verwenden. Beide Befehle geben viele zusätzliche Informationen aus. Wenn Sie jedoch nur die IP-Adresse drucken möchten (z. B. für Shell-Skripte), können Sie den folgenden Befehl verwenden:

$ IP-Adresse | grep inet | awk ' print $2; '
$ IP-Adresse | grep -w inet | awk ' print $2; ' #Für Zeilen mit nur inet nicht inet6 (IPv6)

Der Befehl ip addr erhält alle Details (einschließlich der IP-Adressen), er wird dann an den zweiten Befehl grep inet weitergeleitet, der nur die Zeilen mit inet darin ausgibt. Dies wird dann in awk print die Anweisung geleitet, die das zweite Wort in jeder Zeile ausgibt (um es einfach auszudrücken).

P.S: Du kannst das auch ohne grep machen, wenn du es gut weißt.

3. Blick auf fehlgeschlagene SSH-Versuche

Wenn Sie einen Internetserver mit öffentlicher IP haben, wird dieser ständig mit SSH-Versuchen bombardiert, und wenn Sie Benutzern einen passwortbasierten SSH-Zugriff erlauben (eine Richtlinie, die ich nicht empfehlen würde), können Sie alle derartigen fehlgeschlagenen Versuche mit dem folgender grep-Befehl:

# cat /var/log/auth.log | grep „Fehlgeschlagen“
Probenausgabe
5. Dez. 16:20:03 debian sshd[509]:Passwort für root von 192 fehlgeschlagen.168.0.100 Port 52374 ssh2
5. Dez. 16:20:07 debian sshd[509]:Passwort für root von 192 . fehlgeschlagen.168.0.100 Port 52374 ssh2
5. Dez. 16:20:11 debian sshd[509]:Passwort für root von 192 fehlgeschlagen.168.0.100 Port 52374 ssh2

4. Verrohrung von Grep zu Uniq

Manchmal gibt grep viele Informationen aus. Im obigen Beispiel hat möglicherweise eine einzelne IP versucht, in Ihr System einzudringen. In den meisten Fällen gibt es nur eine Handvoll solcher beleidigenden IPs, die Sie eindeutig identifizieren und auf die schwarze Liste setzen müssen.

# cat /var/log/auth.log | grep "Fail" | uniq -f 3

Der Befehl uniq soll nur die eindeutigen Zeilen drucken. uniq -f 3 überspringt die ersten drei Felder (um die Zeitstempel zu übersehen, die sich nie wiederholen) und beginnt dann nach eindeutigen Zeilen zu suchen.

5. Nach Fehlermeldungen suchen

Die Verwendung von Grep für Zugriffs- und Fehlerprotokolle ist nicht nur auf SSH beschränkt. Webserver (wie Nginx) protokollieren Fehler und Zugriffsprotokolle ziemlich akribisch. Wenn Sie Überwachungsskripts einrichten, die Ihnen Benachrichtigungen senden, wenn grep "404" einen neuen Wert zurückgibt. Das kann ganz nützlich sein.

# grep -w "404" /var/www/nginx/access.Log
192.168.0.100 - - [06/Dez/2018:02:20:29 +0530] "GET /favicon.ico HTTP/1.1" 404 200
"http://192.168.0.102/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/70.0.3538.110 Safari/537.36"
192.168.0.101 - - [06/Dez/2018:02:45:16 +0530] "GET /favicon.ico HTTP/1.1" 404 143
"http://192.168.0.102/" "Mozilla/5.0 (iPad; CPU OS 12_1 wie Mac OS X)
AppleWebKit/605.1.15 (KHTML, wie Gecko) Version/12.0 Mobil/15E148 Safari/604.1"

Die Regex ist möglicherweise nicht „404“, sondern eine andere Regex-Filterung nur für mobile Clients oder nur für Apple-Geräte, die eine Webseite anzeigen. Dadurch erhalten Sie einen tieferen Einblick in die Leistung Ihrer App your.

6. Paketliste

Für Debian-basierte Systeme listet dpkg -l alle Pakete auf, die auf Ihrem System installiert sind. Sie können dies in einen grep-Befehl umleiten, um nach Paketen zu suchen, die zu einer bestimmten Anwendung gehören. Beispielsweise:

# dpkg -l | grep "vim"

7. grep -v Dateinamen

Um alle Zeilen aufzulisten, die nicht ein bestimmtes Muster enthalten, verwenden Sie das Flag -v. Es ist im Grunde das Gegenteil eines normalen grep-Befehls.

8. grep -l

Es listet alle Dateien auf, die mindestens ein Vorkommen des angegebenen Musters enthalten. Dies ist nützlich, wenn Sie in einem Verzeichnis mit mehreren Dateien nach einem Muster suchen. Es druckt nur den Dateinamen und nicht die spezifische Zeile mit dem Muster.

9. Einzelwortoption -w

$ grep -w Dateinamen

Das Flag -w weist grep an, nach dem angegebenen Muster als ganzes Wort zu suchen und nicht nur als Teilzeichenfolge einer Zeile. Zum Beispiel haben wir früher nach der IP-Adresse und dem Muster gesucht inet habe die Zeilen mit beiden gedruckt inet und inet6 Auflistung von IPv4- und IPv6-Adressen. Aber wenn wir -w verwendet haben, markieren Sie nur die Zeilen mit inet ein Wort mit vor- und nachgestellten Leerzeichen ist eine gültige Übereinstimmung.

10. Erweiterter regulärer Ausdruck

Sie werden oft feststellen, dass die in Grep nativen regulären Ausdrücke etwas einschränkend sind. In den meisten Skripten und Anweisungen finden Sie die Verwendung des Flags -E und dies ermöglicht Ihnen die Eingabe von Mustern im sogenannten erweiterten Modus.

Hier sind die Befehle grep und grep -E, um nach den Wörtern Superman und Spiderman zu suchen.

$ grep "\(Super|Spider\)man"-Text
$ grep -E "(Super|Spider)man"-Text

Wie Sie sehen, ist die erweiterte Version viel einfacher zu lesen.

11. Grep für Ihre Container

Wenn auf Ihrem Host ein großer Cluster von Containern ausgeführt wird, können Sie diese nach Image-Namen, Status, Ports, die sie freigeben, und vielen anderen Attributen sortieren. Beispielsweise,

$ docker ps | grep [Bildname]

12. Grep für deine Pods

Wo wir gerade beim Thema Container sind. Kubernetes neigt häufig dazu, mehrere Pods unter einer bestimmten Bereitstellung zu starten. Obwohl jeder Pod einen eindeutigen Namen hat, beginnen sie in einem bestimmten Namespace normalerweise mit dem Bereitstellungsnamen. Wir können davon greifen und alle Pods auflisten, die mit einer bestimmten Bereitstellung verbunden sind.

$ kubectl Pods abrufen | grep

13. Grep für Big Data

Oftmals beinhaltet die sogenannte „Big Data“-Analyse das einfache Suchen, Sortieren und Zählen von Mustern in einem bestimmten Datensatz. UNIX-Dienstprogramme auf niedriger Ebene wie grep, uniq, wc sind darin besonders gut. Diese Blogeintrag zeigt ein schönes Beispiel für eine Aufgabe, die mit grep und anderen Unix-Dienstprogrammen in Sekundenschnelle erledigt wurde, während Hadoop fast eine halbe Stunde dauerte.

Zum Beispiel das Datensatz ist über 1.7 GB groß. Es enthält Informationen über eine Vielzahl von Schachpartien, einschließlich der gemachten Züge, wer gewonnen hat usw. Da uns nur die Ergebnisse interessieren, führen wir den folgenden Befehl aus:

$ grep "Ergebnis" millionbase-2.22.pgn | sortieren | uniq -c
221 [Ergebnis "*"]
653728 [Ergebnis "0-1"]
852305 [Ergebnis "1-0"]
690934 [Ergebnis "1/2-1/2"]

Dies dauerte bei einem 4 Jahre alten 2-Kern/4-Thread-Prozessor etwa 15 Sekunden. Wenn Sie also das nächste Mal ein „Big Data“-Problem lösen. Überlege, ob du stattdessen grep verwenden kannst.

14. grep -color=auto

Mit dieser Option kann grep das Muster innerhalb der Zeile hervorheben, in der es gefunden wurde.

fünfzehn. grep -i

Beim Grep-Mustervergleich wird von Natur aus die Groß-/Kleinschreibung beachtet. Aber wenn Sie sich nicht darum kümmern, dann macht die Verwendung des Flags -i die Groß-/Kleinschreibung von grep nicht.

16. grep -n

Das Flag -n zeigt die Zeilennummern an, damit Sie sich später keine Sorgen machen müssen, dieselbe Zeile zu finden.

17. git grep

Git, das Versionskontrollsystem, verfügt selbst über einen integrierten grep-Befehl, der so ziemlich wie Ihr normales grep funktioniert. Aber es kann verwendet werden, um mit der nativen Git-CLI nach Mustern in jedem festgeschriebenen Baum zu suchen, anstatt mühsame Pipes. Wenn Sie sich beispielsweise im Master-Zweig Ihres Repositorys befinden, können Sie das Repository verwenden, indem Sie Folgendes verwenden:

(Meister) $ git grep

18. grep -o

Das Flag -o ist sehr hilfreich, wenn Sie versuchen, eine Regex zu debuggen. Es wird nur der übereinstimmende Teil der Zeile gedruckt, nicht die gesamte Zeile. Für den Fall, dass Sie zu viele unerwünschte Zeilen für ein bereitgestelltes Muster erhalten, und Sie können nicht verstehen, warum dies geschieht. Sie können das Flag -o verwenden, um die beleidigende Teilzeichenfolge und den Grund für Ihre Regex von dort rückwärts auszugeben.

19. grep -x

Das Flag -x würde genau dann eine Zeile ausgeben, wenn die gesamte Zeile mit Ihrem angegebenen Regex übereinstimmt. Dies ähnelt dem Flag -w, das eine Zeile gedruckt hat, wenn und nur ein ganzes Wort mit dem angegebenen Regex übereinstimmt.

20. grep -T

Wenn Sie mit Protokollen und Ausgaben von Shell-Skripten arbeiten, werden Sie höchstwahrscheinlich auf harte Registerkarten stoßen, um zwischen verschiedenen Ausgabespalten zu unterscheiden. Das Flag -T richtet diese Registerkarten sauber aus, sodass die Spalten sauber angeordnet sind und die Ausgabe für Menschen lesbar ist.

21. grep -q

Dies unterdrückt die Ausgabe und führt leise den grep-Befehl aus. Sehr nützlich, wenn Sie Text ersetzen oder grep in einem Daemon-Skript ausführen.

22. grep -P

Leute, die es gewohnt sind, die Syntax regulärer Ausdrücke zu perl zu verwenden, können das Flag -P verwenden, um genau das zu verwenden. Sie müssen keine grundlegenden regulären Ausdrücke lernen, die grep standardmäßig verwendet uses.

23. grep -D [AKTION]

Unter Unix kann fast alles als Datei behandelt werden. Folglich kann grep . jedes Gerät, ein Socket oder ein FIFO-Datenstrom zugeführt werden. Sie können das Flag -D gefolgt von einer ACTION verwenden (die Standardaktion ist READ). Einige andere Optionen sind SKIP, um bestimmte Geräte stillschweigend zu überspringen, und RECURSE, um Verzeichnisse und Symlinks rekursiv zu durchsuchen.

24. Wiederholung

Wenn Sie nach einem bestimmten Muster suchen, das eine Wiederholung eines bekannten einfacheren Musters ist, verwenden Sie geschweifte Klammern, um die Anzahl der Wiederholungen anzugeben

$ grep -E „[0-9]10“

Dadurch werden Zeilen gedruckt, die Zeichenfolgen mit einer Länge von 10 oder mehr Stellen enthalten.

25. Wiederholungskürzel

Einige Sonderzeichen sind für eine bestimmte Art der Musterwiederholung reserviert. Sie können diese anstelle von geschweiften Klammern verwenden, wenn sie Ihren Bedürfnissen entsprechen.

? : Das Muster vor dem Fragezeichen sollte null oder einmal übereinstimmen.

* : Das Muster vor dem Stern sollte null oder öfter übereinstimmen.

+ : Das Muster vor dem Pluszeichen sollte ein- oder mehrmals übereinstimmen.

25. Byte-Offsets

Wenn Sie den Byte-Offset der Zeilen sehen möchten, in denen der passende Ausdruck gefunden wird, können Sie mit dem Flag -b auch die Offsets ausgeben print. Um nur den Offset des übereinstimmenden Teils einer Zeile zu drucken, können Sie das Flag -b mit dem Flag -o verwenden use.

$ grep -b -o [Dateiname]

Offset bedeutet einfach, nach wie vielen Bytes vom Anfang der Datei beginnt der passende String string.

26. egrep, fgrep und rgerp

Sie werden oft den Aufruf von egrep sehen, um die zuvor besprochene erweiterte Syntax für reguläre Ausdrücke zu verwenden. Dies ist jedoch eine veraltete Syntax und es wird empfohlen, diese zu vermeiden. Verwenden Sie stattdessen grep -E. Verwenden Sie in ähnlicher Weise grep -F anstelle von fgrep und grep -r anstelle von rgrep.

27. grep -z

Manchmal besteht die Eingabe in grep nicht aus Zeilen, die mit einem Zeilenumbruch enden. Wenn Sie beispielsweise eine Liste mit Dateinamen verarbeiten, können diese aus verschiedenen Quellen stammen. Das Flag -z weist grep an, das NULL-Zeichen als Zeilenende zu behandeln. Auf diese Weise können Sie den eingehenden Stream wie jede normale Textdatei behandeln.

28. grep -a [Dateiname]

Das Flag -a weist grep an, die übergebene Datei wie normalen Text zu behandeln. Die Datei könnte eine Binärdatei sein, aber grep behandelt den Inhalt darin, als ob es sich um Text handelt.

29. grep -U [Dateiname]

Das Flag -U weist grep an, die bereitgestellten Dateien so zu behandeln, als ob es sich um Binärdateien und nicht um Text handelt. Standardmäßig errät grep den Dateityp anhand der ersten paar Bytes. Die Verwendung dieses Flags überschreibt die Vermutung, dass es funktioniert.

30. grep -m NUM

Bei großen Dateien kann das Suchen nach einem Ausdruck ewig dauern. Wenn Sie jedoch nur nach den ersten NUM-Zahlen von Übereinstimmungen suchen möchten, können Sie das Flag -m verwenden, um dies zu erreichen. Es geht schneller und der Output ist oft auch überschaubar.

Fazit

Ein Großteil der täglichen Arbeit eines Systemadministrators besteht darin, große Textmengen zu sichten. Dies können Sicherheitsprotokolle, Protokolle von Ihrem Web- oder Mailserver, Benutzeraktivitäten oder sogar umfangreiche Manpages sein. Grep bietet Ihnen das gewisse Extra an Flexibilität bei der Bearbeitung dieser Anwendungsfälle.

Hoffentlich haben Ihnen die oben genannten Beispiele und Anwendungsfälle geholfen, dieses lebende Fossil einer Software besser zu verstehen.

OpenTTD vs. Simutrans
Das Erstellen einer eigenen Transportsimulation kann Spaß machen, entspannend und äußerst verlockend sein. Deshalb sollten Sie so viele Spiele wie mög...
OpenTTD-Tutorial
OpenTTD ist eines der beliebtesten Wirtschaftssimulationsspiele auf dem Markt. In diesem Spiel musst du ein wunderbares Transportunternehmen aufbauen....
SuperTuxKart für Linux
SuperTuxKart ist ein großartiger Titel, der entwickelt wurde, um Ihnen das Mario Kart-Erlebnis kostenlos auf Ihrem Linux-System zu bieten. Es ist ziem...