Einer der klassischen Unix-Befehle, der bereits 1974 von Ken Thompson entwickelt wurde, ist der Befehl Global Regular Expression Print (grep). Es ist in der Computerwelt so allgegenwärtig, dass es häufig als Verb verwendet wird (“durch eine Datei greifen”) und je nachdem, wie geekig Ihr Publikum ist, passt es auch gut in reale Szenarien. (Zum Beispiel: “Ich muss meine Speicherbanken grepen, um diese Informationen abzurufen.”) Kurz gesagt ist grep eine Möglichkeit, eine Datei nach einem bestimmten Zeichenmuster zu durchsuchen. Wenn das nach der modernen Find-Funktion klingt, die in jedem Textverarbeitungs- oder Texteditor verfügbar ist, dann haben Sie die Auswirkungen von grep auf die Computerindustrie bereits erlebt.
Grep ist weit davon entfernt, nur ein uriger alter Befehl zu sein, der durch moderne Technologie ersetzt wurde, sondern liegt in zwei Aspekten:
- Grep arbeitet im Terminal und arbeitet mit Datenströmen, sodass Sie es in komplexe Prozesse einbinden können. Du kannst nicht nur finden ein Wort in einer Textdatei; Sie können das Wort extrahieren, an einen anderen Befehl senden usw.
- Grep verwendet reguläre Ausdrücke, um eine flexible Suchfunktion bereitzustellen.
Erlernen der grep
Der Befehl ist einfach, erfordert jedoch etwas Übung. Dieser Artikel stellt Ihnen einige seiner Funktionen vor, die ich am nützlichsten finde.
[Download our free grep cheat sheet]
grep installieren
Wenn Sie Linux verwenden, haben Sie grep bereits installiert.
Unter macOS haben Sie die BSD-Version von grep. Dies unterscheidet sich geringfügig von der GNU-Version. Wenn Sie also genau diesem Artikel folgen möchten, installieren Sie GNU grep aus einem Projekt wie Homebrew oder MacPorts.
Grundgriff
Die grundlegende grep-Syntax ist immer dieselbe. Sie stellen die grep
Befehlen Sie ein Muster und eine Datei, die Sie durchsuchen möchten. Im Gegenzug druckt es jede Zeile mit einer Übereinstimmung auf Ihrem Terminal aus.
$ grep gnu gpl-3.0.txt
along with this program. If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Standardmäßig ist die grep
Beim Befehl muss die Groß-/Kleinschreibung beachtet werden, daher unterscheidet sich “gnu” von “GNU” oder “Gnu”. Sie können die Groß-/Kleinschreibung mit dem ignorieren --ignore-case
Möglichkeit.
$ grep --ignore-case gnu gpl-3.0.txt
GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Sie können auch die grep
Befehl alle Zeilen zurückgeben ohne ein Spiel mit der --invert-match
Möglichkeit:
$ grep --invert-match
--ignore-case gnu gpl-3.0.txt
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License. But first, please read
Rohre
Es ist nützlich, Text in einer Datei zu finden, aber die wahre Stärke von POSIX liegt in seiner Fähigkeit, Befehle durch “Pipes” zu verketten. Ich finde, dass ich grep am besten nutze, wenn es mit anderen Werkzeugen wie Cut, Tr oder Curl kombiniert wird.
Angenommen, ich habe eine Datei, die einige technische Dokumente auflistet, die ich herunterladen möchte. Ich könnte die Datei öffnen und manuell auf jeden Link klicken und dann durch die Firefox-Optionen klicken, um jede Datei auf meiner Festplatte zu speichern, aber das ist viel Zeit und Klicken. Stattdessen könnte ich nach den Links in der Datei suchen und drucken nur die passende Zeichenfolge mit dem --only-matching
Möglichkeit:
$ grep --only-matching http://.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf
Die Ausgabe ist eine Liste von URLs, jede in einer Zeile. Dies ist eine natürliche Anpassung an die Art und Weise, wie Bash Daten verarbeitet, sodass ich die URLs, anstatt die URLs auf meinem Terminal ausgeben zu lassen, sie einfach an weiterleiten kann curl
:
$ grep --only-matching http://.*pdf
example.html | curl --remote-name
Dadurch wird jede Datei heruntergeladen und entsprechend ihrem Remote-Dateinamen auf meiner Festplatte gespeichert.
Mein Suchmuster in diesem Beispiel mag kryptisch erscheinen. Das liegt daran, dass es reguläre Ausdrücke verwendet, eine Art “Platzhalter”-Sprache, die besonders nützlich ist, wenn Sie viel Text durchsuchen.
Regulären Ausdruck
Niemand hat die Illusion, dass reguläre Ausdrücke (kurz: Regex) einfach sind. Ich finde jedoch, dass es oft einen schlechteren Ruf hat, als es verdient. Zugegeben, es gibt das Potenzial für die Leute, ein wenig zu bekommen zu schlau mit Regex, bis es so unlesbar und so breit ist, dass es sich in sich zusammenfaltet, aber Sie müssen Ihre Regex nicht übertreiben. Hier ist eine kurze Einführung in Regex, wie ich es verwende.
Erstellen Sie zunächst eine Datei namens example.txt
und geben Sie diesen Text ein:
Albania
Algeria
Canada
0
1
3
11
Das grundlegendste Element von Regex ist das bescheidene .
Charakter. Es repräsentiert ein einzelnes Zeichen.
$ grep Can.da example.txt
Canada
Das Muster Can.da
erfolgreich zurückgegeben Canada
weil der .
Charakter repräsentiert irgendeinen eins Charakter.
Der .
Platzhalter können geändert werden, um mehr als ein Zeichen mit diesen Notationen darzustellen:
?
stimmt null oder einmal mit dem vorhergehenden Element überein*
stimmt null oder öfter mit dem vorhergehenden Element überein+
stimmt ein- oder mehrmals mit dem vorhergehenden Element überein{4}
stimmt viermal mit dem vorhergehenden Element (oder einer beliebigen Zahl, die Sie in die Klammern eingeben) überein
Ausgestattet mit diesem Wissen können Sie Regex an üben example.txt
den ganzen Nachmittag, um zu sehen, welche interessanten Kombinationen Sie sich einfallen lassen. Einige werden nicht funktionieren; andere werden. Das Wichtigste ist, die Ergebnisse zu analysieren, damit Sie verstehen, warum.
Erweiterte Regex erfordert die –extended-regexp oder -E Möglichkeit.
Dies kann beispielsweise kein Land zurückgeben:
$ grep -E A.a example.txt
Es scheitert, weil die .
Charakter kann immer nur einem einzelnen Charakter entsprechen, es sei denn, Sie steigen auf. Verwendung der *
Charakter, das merkt man grep
um ein einzelnes Zeichen null oder so oft wie nötig zu finden, bis es das Ende des Wortes erreicht. Weil Sie die Liste kennen, mit der Sie es zu tun haben, wissen Sie das null mal ist in diesem Fall nutzlos. Es gibt definitiv keine dreibuchstabigen Ländernamen in dieser Liste. Stattdessen können Sie +
um ein einzelnes Zeichen mindestens einmal und dann so oft wie nötig bis zum Ende des Wortes zu finden:
$ grep -E A.+a example.txt
Albania
Algeria
Sie können eckige Klammern verwenden, um eine Liste von Buchstaben bereitzustellen:
$ grep -E [AC].+a example.txt
Albania
Algeria
Canada
Dies funktioniert auch für Zahlen. Die Ergebnisse werden Sie vielleicht überraschen:
$ grep [1-9] example.txt
1
3
11
Sind Sie überrascht, 11 bei einer Suche nach den Ziffern 1 bis 9 zu sehen?
Was passiert, wenn Sie Ihrer Liste 13 hinzufügen?
Diese Zahlen werden zurückgegeben, weil sie eine 1 enthalten, die zu der Liste der abzugleichenden Ziffern gehört.
Wie Sie sehen, ist Regex ein Rätsel, aber durch Experimentieren und Üben können Sie sich damit vertraut machen und es verwenden, um die Art und Weise zu verbessern, wie Sie mit Ihren Daten umgehen.
Laden Sie den Spickzettel herunter
Der grep
Befehl hat weit mehr Optionen, als ich in diesem Artikel gezeigt habe. Es gibt Optionen, um Ergebnisse besser zu formatieren, Dateien und Zeilennummern mit Übereinstimmungen aufzulisten, Kontext für Ergebnisse bereitzustellen, indem die Zeilen um eine Übereinstimmung gedruckt werden und vieles mehr. Wenn Sie grep lernen oder es einfach oft verwenden und darauf zurückgreifen, es zu durchsuchen info
Seiten, tun Sie sich selbst einen Gefallen, indem Sie unseren Spickzettel dafür herunterladen. Der Spickzettel verwendet kurze Optionen (-v
anstatt --invert-matching
, zum Beispiel), um Sie mit der gebräuchlichen Grep-Kurzschrift vertraut zu machen. Es enthält auch einen Regex-Abschnitt, der Ihnen hilft, sich an die gebräuchlichsten Regex-Codes zu erinnern. Laden Sie den grep-Spickzettel noch heute herunter!