30 Grep-Beispiele für Systemadministratoren

30 Grep Examples System Admins



Sie finden grep tief im tierischen Gehirn von Unix und Unix-ähnlichen Betriebssystemen. 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).

Dabei ist das Erlernen von formalen Sprachen und regulären Ausdrücken ein spannendes Thema. 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 Praxis 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 für einen Menschen zu lang, um sie zu überprüfen. 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. Dies könnte beispielsweise sshd oder nginx oder httpd sein.



# ps an | grep sshd
Wurzel400 0.0 0,2 69944 5624? Ss17:47 0: 00/usr/sbin/sshd-D
Wurzel1076 0,2 0,3 95204 6816? Ss18:29 0:00 sshd: root@Punkte/0
Wurzel1093 0.0 0.0 12784 932Punkte/0S+18:29 0: 00Griffsshd

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 | Griffinet| awk '{ drucke $ 2; }'
$IP-Adresse | Griff -ininet| awk '{ drucke $ 2; }' #Für Leitungen mit nur inet nicht inet6 (IPv6)

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

PS: Sie können dies auch ohne grep tun, wenn Sie sich gut auskennen.



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 Fail
Probenausgabe
Dezember5 16:zwanzig:03 debian sshd[509]:Passwort fehlgeschlagenzumroot von Port 192.168.0.10052374ssh2
Dezember5 16:zwanzig:07 debian sshd[509]:Passwort fehlgeschlagenzumroot von Port 192.168.0.10052374ssh2
Dezember5 16:zwanzig:elfdebian sshd[509]:Passwort fehlgeschlagenzumroot von Port 192.168.0.10052374ssh2

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.

#Katze /wo/Protokoll/auth.log| Griff 'Scheitern' | einzigartig -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 Überwachungsskripte einrichten, die Ihnen Warnungen 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/Dezember/2018: 02:zwanzig: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/Dezember/2018: 02:Vier fünf: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 Mobile/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. Auf diese Weise erhalten Sie einen tieferen Einblick in die Leistung Ihrer App.

6. Paketliste

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

#dpkg -das | Griff 'Ich kam'

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

$Griff -in <MUSTER>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 Listet sowohl IPv4- als auch IPv6-Adressen auf. Aber wenn wir -w verwendet haben, markieren Sie nur die Zeilen mit inet als 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.

$Griff '(Super|Spinnen)Mann'Text
$Griff -UND '(Super|Spider)Mann'Text

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

11. Grep für deine 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. Zum Beispiel,

$Dockerps | Griff [Bildname]

12. Grep für deine Kapseln

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 einer bestimmten Bereitstellung zugeordnet sind.

$kubectl bekommt pods| Griff <Bereitstellungsname>

13. Griff 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 dabei besonders gut. Dieser Blogbeitrag 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.

Dieser Datensatz ist beispielsweise ü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:

$Griff 'Ergebnis'Millionenbasis-2.22.pgn| Sortieren | einzigartig -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. Das nächste Mal lösen Sie also ein Big-Data-Problem. Überlegen Sie, ob Sie stattdessen grep verwenden können.

14. grep –color=auto

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

15. 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, sodass Sie sich später keine Sorgen machen müssen, dieselbe Zeile zu finden.

17. git grep

Git, das Versionskontrollsystem, verfügt selbst über einen eingebauten 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 langwierige Pipes. Wenn Sie sich beispielsweise im Master-Zweig Ihres Repositorys befinden, können Sie das Repository verwenden, indem Sie Folgendes verwenden:

(Meister)$git grep <Muster>

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. Falls Sie also 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 Ihrer angegebenen Regex übereinstimmt. Dies ähnelt dem Flag -w, das eine Zeile ausgibt, wenn und nur ein ganzes Wort mit der 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 den grep-Befehl leise 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 per 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.

23. grep -D [AKTION]

Unter Unix kann fast alles als Datei behandelt werden. Folglich kann grep ein beliebiges 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 rekursiv durch Verzeichnisse und symbolische Links zu gehen.

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

$Griff -UND [0-9]{10}

Dadurch werden Zeilen gedruckt, die Zeichenfolgen mit einer Länge von 10 oder mehr Ziffern 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. Um nur den Offset des übereinstimmenden Teils einer Zeile zu drucken, können Sie das Flag -b mit dem Flag -o verwenden.

$Griff -B -oder <MUSTER> [Dateiname]

Offset bedeutet einfach, nach wie vielen Bytes vom Anfang der Datei beginnt der passende 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 nicht zu verwenden. 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 Newline-Zeichen 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, indem es sich die ersten paar Bytes ansieht. Die Verwendung dieses Flags überschreibt diese Vermutungen.

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 dies mit dem Flag -m erreichen. Es ist schneller und die Ausgabe ist oft auch überschaubar.

Abschluss

Ein Großteil der täglichen Arbeit eines Systemadministrators besteht darin, große Textmengen zu durchsuchen. Dies können Sicherheitsprotokolle, Protokolle von Ihrem Web- oder Mailserver, Benutzeraktivitäten oder sogar umfangreiche Manpages sein. Grep bietet Ihnen bei diesen Anwendungsfällen zusätzliche Flexibilität.

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