Was ist GREP in Linux und wie verwendet man es

Grep ist ein kleines UNIX-Programm zum Finden übereinstimmender Muster. Ursprünglich in V6 UNIX veröffentlicht, ist es heute auf fast jedem UNIX-ähnlichen System wie Linux, macOS und sogar BSDs zu finden. In diesem Artikel werde ich die Grundlagen von Grep durchgehen und Ihnen einige Beispiele zeigen, wie Sie das Programm für alltägliche Aufgaben verwenden können.
Die Grundlagen der Verwendung von Grep
Im Kern ist Grep ein einfaches und geradliniges Programm. Es nimmt eine Eingabe entgegen, findet den Text, den Sie in dieser Eingabe möchten, und gibt die Übereinstimmungen als Ausgabe aus. Grep kann praktisch jede Quelle von einfachem Text verarbeiten. Das ermöglicht es ihm, Eingaben von anderen Befehlen zu lesen und direkt in Dateien zu suchen.
Der einfachste Weg, mit Grep zu beginnen, ist das Lesen von Daten aus einer Textdatei. Zum Beispiel gibt der folgende Befehl den Inhalt meiner Datei sample.txt aus:
grep'' sample.txtDarüber hinaus können Sie diese Funktion verwenden, um bestimmte Textteile in Ihren Textdateien zu suchen und zu finden:
grep'word' sample.txt
Sie können Grep auch mit UNIX-Pipes verwenden, sodass Sie mehrere Programme in einem einzigen Befehl verbinden können:
cat sample.txt |grep''
Gut zu wissen: Möchten Sie Ihr UNIX-Wissen erweitern? Lernen Sie, wie Bildschirmpager in Linux funktionieren, indem Sie unser Cheatsheet für GNU less ansehen.
Dateien in einem Verzeichnis finden
Eine der einfachsten Aufgaben, die Sie mit Grep erledigen können, ist das Finden von Dateien in einer Verzeichnisauflistung. Dazu können Sie die Ausgabe des ls-Befehls durch eine UNIX-Pipe direkt an Grep senden.
Der folgende Befehl gibt alle Dateien in Ihrem Downloads-Ordner mit der Dateierweiterung .jpg aus und hebt sie hervor:
ls ~/Downloads |grep \\.jpg
Sie können auch eine aufwendigere ls-Ausgabe an Grep senden und diese für die Mustererkennung verwenden. Zum Beispiel listet der folgende Befehl alle Dateien im Verzeichnis mit weniger als 1 MB Dateigröße auf:
ls-lh ./|grep .KBerücksichtigen Sie die Groß- und Kleinschreibung
Im Standardmodus sind fast alle Programme in einem UNIX-ähnlichen System groß- und kleinschreibungsempfindlich. Das bedeutet, dass das System die Zeichenfolge „Hello“ anders behandelt als „hello“, „hEllo“ und „helLo“.

Dieses Verhalten kann lästig sein, wenn Sie nach Zeichenfolgen in Dateien suchen. Zum Beispiel kann ein Aufsatz sowohl „Hello“ als auch „hello“ zur gleichen Zeit enthalten. Um dies zu beachten, führen Sie Grep mit dem -i-Flag gefolgt von der Zeichenfolge aus, die Sie finden möchten.
grep-i Hello hello.txt
Rekursive Suchen
Grep kann gleichzeitig durch mehr als eine Datei oder ein Verzeichnis suchen. Dies ist nützlich, wenn Sie an einem Projekt mit mehreren Dateien arbeiten und wissen möchten, wo eine Zeichenkette in einem Verzeichnis erscheint. Zum Beispiel sucht der folgende Befehl nach dem Wort „MakeTechEasier“ im Verzeichnis „sample“:
grep-r'MakeTechEasier' ./sampleDas setzt voraus, dass Grep mit dem -r-Flag auch durch jede Datei in Ihrem Zielverzeichnis sucht. Das kann ein Problem sein, wenn Sie auch Nicht-Textdateien in dem Ordner haben, in dem Sie suchen. Um dies zu verhindern, führen Sie Grep mit dem -I-Flag aus:
grep-rI'MakeTechEasier' ./sampleNebenbei bemerkt: Lernen Sie, wie Sie Dateien im Terminal mit dem touch-Befehl erstellen können.
Übereinstimmende Dateien, die eine Zeichenfolge enthalten
Abgesehen davon, dass angezeigt wird, wo eine bestimmte Zeichenfolge in verschiedenen Dateien vorkommt, können Sie Grep auch verwenden, um eine Liste von Dateien zu erstellen, die Ihren Zieltext enthalten. Dies ist nützlich, wenn Sie wissen möchten, ob eine Datei eine bestimmte Zeichenfolge enthält, aber nicht wollen, dass Grep jede Instanz davon im Terminal ausgibt.
Um dies zu tun, führen Sie Grep mit den -r- und -l-Flags gefolgt von der Zeichenfolge aus, die Sie übereinstimmen möchten, und dem Verzeichnis, das Sie ansehen möchten:
grep-rl MakeTechEasier ./sampleSie können sogar Ihren Grep-Befehl innerhalb eines Bash-Unterprozesses einschließen, um mehrere Bedingungen für Ihre Textübereinstimmung zu erstellen. Zum Beispiel gibt die folgende Zeile nur die Dateien zurück, die sowohl „Hello“ als auch „MakeTechEasier“ im Ordner „sample“ enthalten:
grep-rl MakeTechEasier $(grep-rl Hello ./sample)Das Gegenteil finden
Abgesehen von direkten Suchen kann Grep auch die Ergebnisse zurückgeben, die nicht mit Ihren ursprünglichen Kriterien übereinstimmen. Das mag zunächst kontraintuitiv erscheinen, kann jedoch hilfreich sein, um Fehler und Anomalien in Ihrem Texteingang hervorzuheben.
Um dies zu tun, führen Sie Grep mit -v zusammen mit den anderen Flags aus, die Sie aktivieren möchten. Zum Beispiel sucht der folgende Befehl rekursiv durch jede Datei in meinem Ordner „/etc/nginx“ und gibt alle Zeilen zurück, die nicht die Zeichenfolge „nginx“ enthalten:
grep-rv'nginx'/etc/nginx
Wörter und Zeilen
Es kann auch nützlich sein, Grep anzuweisen, nach vollständigen Wörtern oder Zeilen zu suchen, anstatt nach allem, was ein bestimmtes Muster enthält. Dies ist nützlich, wenn Sie eine Zeichenfolge von Zeichen abgleichen, die in vielen Wörtern häufig vorkommt. Zum Beispiel würde die Übereinstimmung des Wortes „it“ eine Menge falscher Positiver zurückgeben, da „it“ eine gängige Zeichenfolge ist, die Sie in Wörtern finden können.
Um dies zu beheben, können Sie Grep mit dem -w-Flag gefolgt von dem Wort, das Sie übereinstimmen möchten, ausführen:
cat it.txt |grep-w it
Anstatt jedes Wort, das das Muster enthält, auszugeben, gibt Grep nur das Wort selbst aus. Dasselbe funktioniert bei gesamten Zeilen mit dem -x-Flag, sodass es wirklich helfen kann, wenn Sie nach einem Satz oder einer einzelnen Zeile in einer Konfigurationsdatei suchen.
Hinzufügen von Zeilennummern zur Grep-Ausgabe
Zeilennummern sind ein wichtiger Teil des Debuggens von Programmen und des Korrekturlesens von Texten. Sie ermöglichen es Ihnen, den Standort einer bestimmten Funktion oder eines bestimmten Satzes genau zu referenzieren, was das Beheben und Ändern erheblich schneller macht.
In dieser Hinsicht verfügt Grep über die Fähigkeit, Zeilennummern in seiner Standardausgabe auszudrucken. Dazu führen Sie das Programm mit dem -n-Flag gefolgt von der Zeichenfolge, die Sie übereinstimmen möchten, aus:
grep-n main ./my-code.cMit Hilfe von UNIX-Pipes können Sie auch die Ausgabe von Grep ändern und nur die Zeilennummern dessen ausgeben, wonach Sie suchen. Dies macht es viel sauberer und einfacher, große Texte zu analysieren:
grep-n Sed essay.txt |cut-f1-d :FYI: UNIX-Pipes sind mehr als nur ein Werkzeug für Grep. Lernen Sie, wie Sie Ihre Remote-Shell-Aufgaben automatisieren, indem Sie SSH-Pipes erstellen und verwenden.
Verwendung von erweitertem Regex mit Grep
Grep verwendet das Set von grundlegenden regulären Ausdrücken (BRE), um Textzeichenfolgen abzugleichen und zu filtern. Während dies normalerweise für die meisten Aufgaben funktioniert, finden einige Benutzer es einschränkend, insbesondere beim Arbeiten mit Mustergruppen.
Um dem Rechnung zu tragen, bieten die meisten Grep-Implementierungen das -E-Flag, das es dem Programm ermöglicht, erweiterte reguläre Ausdruckszeichen (ERE) zu parsen. Zum Beispiel funktioniert der folgende Befehl nur mit dem -E-Flag:
printf"hello\nhellooooo\n"|grep-E .*o{2}$Hinweis: Die GNU-Version von Grep verwendet standardmäßig einige ERE-Funktionalitäten. Es ist jedoch eine gute Praxis, -E zu verwenden, wann immer Sie ERE verwenden, um die Kompatibilität mit anderen UNIX-ähnlichen Systemen zu gewährleisten.
Darüber hinaus hat Grep auch einen speziellen Modus, der alle Regex-Funktionen ganz fallenlässt. Um dies zu verwenden, führen Sie das Programm mit dem -F-Flag gefolgt von Ihrer einfachen Zeichenfolge aus:
grep-F[MakeTechEasier] ./fixed.txtHinzufügen benachbarter Zeilen zur Grep-Ausgabe
Eine der grundlegenden Stärken von Grep besteht darin, zu zeigen, wo Text in Ihrer Datei oder Eingabeströmung erscheint. Es gibt jedoch Fälle, in denen es nicht hilfreich ist, nur den genauen Standort einer Zeichenfolge zu kennen, wenn Sie Probleme beheben. Zum Beispiel bietet ein Crash-Log normalerweise zusätzlichen Kontext, bevor es die traditionelle „Segmentierungsfehler“-Meldung ausgibt.
Eine Möglichkeit, dieses Problem zu lösen, besteht darin, Grep mit dem -C-Flag gefolgt von der Anzahl der Zeilen auszuführen, die Sie um Ihren Zieltext drucken möchten. Der folgende Befehl druckt fünf Zeilen vor und nach Ihrer Textübereinstimmung:
grep-C5'Hello' ./hello-sample.txt
Sie können auch anpassen, ob Grep nur die vorangegangenen oder nachfolgenden Kontexte mit den -B- und -A-Flags druckt. Zum Beispiel druckt der folgende Befehl die vorherigen zehn Zeilen nach Ihrer Zielzeichenfolge:
grep-A10'Hello' ./hello-sample.txt
Mit den Grundlagen von Grep und wie man es für alltägliche Aufgaben einsetzt, können Sie nun den ersten Schritt im Verständnis der Kommandozeile und der grundlegenden UNIX-Dienstprogramme unternehmen. Erkunden Sie mehr in dieser sehr vielfältigen und tiefen Welt, indem Sie lernen, wie sed in Linux funktioniert.
Bildnachweis: Alejandro Escamilla über Unsplash. Alle Änderungen und Screenshots von Ramces Red.