Grep und Sed Entmystifiziert

Grep. Du hörst es viel. Sie sehen diese kryptischen IT-Leute, die den Befehl eingeben, Systemadministratoren erwähnen es nebenbei, Sie sehen es sogar in einigen Shell-Skripten. Es scheint wie eines der Dinge, die nur existieren, aber nicht für Sie bestimmt sind. Dieser Artikel wird das ändern. Wir werden in diesem neuesten Teil von OS X Demystified kurz grep (und seinen weniger bekannten Freund sed) näher erläutern.


Einführung

Grep

Grep ist ein Befehlszeilen-Dienstprogramm zum Suchen und Filtern von Texteingaben auf der Grundlage der von Ihnen eingegebenen Parameter

Grep ist ein Befehlszeilen-Dienstprogramm zum Suchen und Filtern von Texteingaben auf der Grundlage der von Ihnen eingegebenen Parameter. Mit anderen Worten, es läuft im Terminal (Anwendungen → Dienstprogramme → Terminal) und wird ausschließlich durch Eingabe von Befehlen verwendet. Natürlich gibt es GUI-Wrapper, die ein wenig helfen, aber keine ist so leistungsfähig oder vielseitig wie die Verwendung der Befehlszeilen für die nackten Knochen, daher konzentrieren wir uns darauf.

Das ist alles schön, aber was macht es eigentlich? Klingt das Obige zu vage? Hier ist ein Beispiel. Angenommen, Sie haben einen Textblock in einer Datei namens jungle.txt mit fünf Zeilen:

Ein Löwe schläft im Dschungel Ein Löwe schläft heute Nacht Ein Tiger erwacht im Sumpf Der Papagei beobachtet Wimoweh, Wimoweh, Wimoweh, Wimoweh

Um die Zeile zu finden, die das Wort Tiger enthält, verwenden wir grep so:

grep tiger jungle.txt

Das Ergebnis, das wir erhalten, ist:

"Ein Tiger erwacht im Sumpf"

Ok, das ist klar, richtig? Lass uns einen Schritt zurückgehen.

Grep aktualisieren

Wie sich herausstellt, ist Mac grep langsamer als GNU grep, also nehmen wir zuerst ein Upgrade vor. Um ein schnelleres grep zu installieren, geben Sie Folgendes in Terminal ein und drücken Sie eingeben:

Installieren Sie https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb

Bitte beachten Sie, dass Sie Homebrew installiert haben müssen, um dies tun zu können. Wie Sie Homebrew installieren, erfahren Sie in meinem vorherigen Artikel.

Eine Vielzahl von Geeklets wird häufig von grep abgerufen, um Daten aus großen Textdateien oder geernteten Websites abzurufen

Was haben wir mit diesem Upgrade erreicht? Viele Apps verwenden das installierte native grep-Tool, um zu funktionieren. Eine Vielzahl von Geeklets ist beispielsweise häufig auf grep angewiesen, um Daten aus großen Textdateien oder geernteten Websites abzurufen. Somit, alles Ihre grep-verwendenden Geeklets werden jetzt in ihren greppy-Bereichen um ein Vielfaches schneller. Darüber hinaus müssen Sie möglicherweise manchmal ein Fehlerprotokoll erstellen (nehmen Sie an, Sie haben ein umfangreiches Fehlerprotokoll in einer Anwendung, und der Support-Service der App fordert Sie auf, "grep port-1723" einzufügen). Wenn das Protokoll Millionen Codezeilen enthält, können Sie mit diesem viel schnelleren grep viel Zeit sparen.

Sobald Homebrew Ihr neues grep installiert hat, versuchen Sie Folgendes, wenn Sie die Dateien erstellt haben. Wenn nicht, machen Sie sie weiter und führen Sie den Befehl aus, um sicherzustellen, dass alles funktioniert.

grep tiger jungle.txt

Sed

Sed ist ein stream editor. Kurz gesagt, nimmt er Eingaben auf, bearbeitet sie und gibt den bearbeiteten Inhalt aus. Ob es sich um eine Bearbeitung in eine Datei handelt oder direkt von Terminal eingespeist wird, ist für sed völlig irrelevant - es verfügt über eine hochentwickelte und konfigurierbare Funktion, die es nach besten Kräften ausführt.

Sed nimmt eine Texteingabe, einen Befehl zum Ändern und erzeugt eine geänderte Ausgabe

Wo wird Sed verwendet? Das Bearbeiten von Dateiinhalten und Ähnlichem natürlich, aber es ist nur so, dass es problemlos mit grep funktioniert. Sehen wir uns jedoch zuerst einige reine Sed-Beispiele an. Geben Sie Folgendes in Terminal ein:

Echo "Hallo"

und drücken Sie die Eingabetaste. Das Terminal sagt Hallo. Jetzt tippen

Echo "Hallo" | sed 's / Hell / Heaven /'

und drücken Sie die Eingabetaste. Sie sollten "Heaveno" sehen. Was ist gerade passiert? Sed macht zwei Argumente. Der erste ist der Feed, die Eingabe und der zweite ist eine Zeichenfolge (Sie können sehen, dass es eine Zeichenfolge ist, weil sie in Anführungszeichen steht), die angibt, welche Aktionen für das erste Argument ausgeführt werden sollen. In unserem Fall heißt das:

  • s (Stellvertreter)
  • / (Trennzeichen - in unserem Fall Schrägstrich, siehe nächsten Absatz für Alternativen)
  • Hell (Muster für reguläre Ausdrücke, nach dem gesucht werden soll)
  • Himmel (Ersatzschnur)

Das zweite Listenelement nennt Alternativen zum Schrägstrich für Schrägstrich. Manchmal sind sie sehr nützlich, weil zum Beispiel URLs oder Dateipfade geschrieben werden müssen. Nehmen Sie zum Beispiel die URL myfolder / mysubfolder / myfile. Wenn wir dies in sed legen, um es durch zu ersetzen myotherfolder / myotherfile, Der Parameter würde so aussehen: s / meinordner / mysubfolder / meinedatei / meinotherordner / meinotherdatei / was nur ein großer Sack voll Unsinn ist, kann unmöglich wissen, welches dieser Fragmente der Regex ist und welcher der Ersatzstring ist. Deshalb müssten wir das tun Flucht die Vorwärtsschläge in unserem Dateipfad mit Backslash, so dass sich jeder Vorwärtsstoß in dem Pfad in verwandeln würde \ /. Ich vermute, Sie können das Problem sehen. Der neue sed-Parameter sieht folgendermaßen aus:

sed 's / myfolder \ / mysubfolder \ / myfile / myotherfolder \ / myotherfile /'

Dieses kaum lesbare Format wird als "Picket Fence" bezeichnet. Um dies zu vermeiden, unterstützt sed verschiedene Trennzeichen wie Unterstrich (_), Doppelpunkt (:) und Pipe (|). Wenn wir beispielsweise das Pipe-Zeichen als Trennzeichen verwenden möchten, würden wir am Ende Folgendes anzeigen:

sed's | myfolder / mysubfolder / myfile | myotherfolder / myotherfile | '

Viel besser, nein?

Eine andere Sache jedoch. Wir sagten, Sed hätte zwei Argumente, aber wir geben immer nur einen - direkt nach dem sed Befehl. Dies liegt an dem Pfeifencharakter nach unserem Echo Befehl. Die Pipe dient als Mittel, um die Ausgabe des linken Operanden in die Eingabe des rechten Operanden zu lenken. In unserem Fall erzählte der Pfeifencharakter dem sed Programm "Nimm als Eingabe, was immer du von dem bekommst, was auf der linken Seite von mir ist". sed hat keine Ahnung, dass es sich um Echo handelt - es muss nicht wissen. Alles, was es weiß, ist, dass es eine Texteingabe erfordert. Eine ausführlichere Erörterung der Pipeline ist nicht Gegenstand dieses Artikels. Sie können sich jedoch bei Interesse gerne informieren.

Die Pipe dient als Mittel, um die Ausgabe des linken Operanden in die Eingabe des rechten Operanden zu lenken.

Wie kombinieren wir es mit grep? Es ist genau das gleiche. Betrachten wir unser vorheriges Beispiel und geben Sie Folgendes in das Terminal ein.

grep tiger jungle.txt | sed 's / sumpf / wüste /'

und wir bekommen die Ausgabe

"Ein Tiger erwacht in der Wüste"

Betrachten wir nun einen Anwendungsfall in der realen Welt.


Real World Anwendung

Für unsere "Sezierung" nehmen wir den Befehl grep + sed eines beliebten Wettergeeklets und erklären es Stück für Stück. Laden Sie das Beispiel-Geeklet herunter. Nach dem Herunterladen öffnen Sie es mit einem Texteditor. Sie werden feststellen, dass es nicht mehr als eine XML-Datei ist. Wenn Sie keine Erfahrung mit XML haben, machen Sie sich keine Sorgen - Josh hat bereits einen erstaunlichen Artikel über Geektool und dessen Ins und Outs verfasst. Wir werden uns heute nicht mit dem Kleinsten beschäftigen. Konzentrieren wir uns stattdessen auf den Teil zwischen Stichworte:

 curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Aktuelle Bedingungen: | C// '-e' s /// '-e' s /<\/b>// '-e' s /
// '-e' s /// '-e' s /<\/description>// '

Dieses kryptische Chaos ist ein einfacher Terminalbefehl - mehr nicht. Sie können es sogar in das Terminal einfügen, und Sie erhalten die Wetterbedingungen für Makati City auf den Philippinen, die vom ursprünglichen Autor festgelegt wurden. Das Geeklet weist Geektool an, den Befehl auszuführen und die Ausgabe zu übernehmen, die er erhält. Schauen wir uns das Rohrsegment für Rohrsegment an und erläutern es im Detail:

curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c"

locken ist ein Tool zum Übertragen von Daten mit einer URL-Syntax. Das heißt, es kann zu einer URL gehen und Daten von dieser abrufen.

Curl ist ein Tool zum Übertragen von Daten mit einer URL-Syntax in der Befehlszeile

Wenn Sie die angegebene URL in Ihren Browser einfügen (oder einfach hier klicken), werden Sie feststellen, dass Sie eine XML-Datei von Yahoo! erhalten. - Sie verfügen über einen Live-Wetterdienst, auf den Sie einfach zugreifen und Daten abrufen können. Das ist genau das gleiche, was Sie bekommen, wenn Sie locken es; Nur anstelle des Browsers wird die Eingabe an das Terminal gesendet. Das --Leise Das Flag weist curl an, über Fortschritt, Status und Fehler ruhig zu sein, so dass die einzige Ausgabe, die wir erhalten, die Ausgabe ist, die wir benötigen (oder nichts, wenn sie fehlschlägt)..

grep -E '(Aktuelle Bedingungen: | C 

Das Pipe-Zeichen folgt, dh die Ausgabe von locken wird als Eingabe in grep gesendet. Grep empfängt diese heruntergeladene XML-Datei im Textformat und führt eine Suche mit der -E flag, was der erweiterte reguläre Ausdruck bedeutet. Der Wert, nach dem gesucht wird, ist entweder die Zeichenfolge Aktuelle Bedingungen: oder C (der Pfeifencharakter in einem ereg bedeutet "oder"). Zur weiteren Klarstellung, wenn Sie Folgendes in unser vorheriges Beispiel eingegeben haben:

grep -E '(tiger | weh)' jungle.txt

du würdest bekommen

Ein Tiger erwacht im Sumpf Wimoweh, Wimoweh, Wimoweh, Wimoweh

weil es alle Zeilen zurückgibt, die entweder "Tiger" oder "Weh" enthalten.

Wenn wir also diese beiden ersten Rohrsegmente zusammen ausführen, so

curl --silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Aktuelle Bedingungen: | C 

wir bekommen folgendes:

Aktuelle Bedingungen:
Haze, 23 C

Wir wollen aber nur "Haze, 23 C" bekommen. Das ist wo sed kommt rein. Wir ersetzen einfach alles, was wir nicht möchten, durch eine leere Zeichenfolge (nichts), um sie effektiv zu löschen.

sed -e 's / Aktuelle Bedingungen: //' -e 's /
// '-e' s /// '-e' s /<\/b>// '-e' s /
// '-e' s /// '-e' s /<\/description>// '

Das -e flag ist kurz für --Ausdruck = und ermöglicht es uns, mehrere zu verketten sed Befehle. Deshalb ersetzen wir zuerst die Zeichenfolge "Current Conditions:" durch nichts, gefolgt vom Ersetzen
mit nichts usw., bis wir das mögliche Ende der Linie erreichen ().

Am Ende bleibt nur noch "Haze, 23 C".

Ich sollte erwähnen, dass das Geeklet, das wir als Beispiel verwendet haben, viel besser hätte gemacht werden können, aber die schiere Komplexität des Befehls schien eine sehr gute Gelegenheit zu sein, um mehrere Beispiele gleichzeitig zu behandeln. Der Autor hätte zum Beispiel einfach die Zeile mit "Current condition:" und die folgende Zeile mit dem Befehl abrufen können -A 1 Flag-Kombination, ohne auf das Temperatursymbol angewiesen zu sein (in diesem Fall verlassen wir uns auf Celsius, aber was ist, wenn wir Fahrenheit wollten?) C Grep-Suche würde fehlschlagen). Dennoch diente das Beispiel einem Zweck - und das führte Sie in die wundervolle Welt von grep und sed.


Mehr Ressourcen

Während Sie fortgeschrittene reguläre Ausdrücke und tiefere grep-, curl- und sed-Funktionen unterrichten, liegt der Rahmen dieses Artikels (und dieser Website) weit außerhalb des Bereichs. Wenn Sie mehr wissen möchten, schauen Sie sich bitte die folgenden Ressourcen an.

  • Sed-Führer
  • Anfängerleitfaden für grep
  • Beispiele für praktische Unix-Grep-Befehle
  • Grep-Dokumentation bei IBM
  • Curl-Dokumentation
  • Reguläre Ausdrücke

Fazit

Sie kennen jetzt die Grundlagen von grep, sed und selbst locken. Obwohl dieser Crash-Kurs noch lange nicht ausreichte, um Sie zu einem Experten zu machen, hoffen wir, dass er zumindest ausreichte, um Ihre eigene Datenerfassung und -abfrage zu versuchen. Zumindest ist es am Montag etwas um den Wasserkühler zu reden.

Ich hoffe, es hat Ihnen gefallen, und wenn Sie sich einer Herausforderung stellen wollen, schreiben Sie das Geeklet so um, dass es nicht nur temperatursymbolunabhängig ist, sondern auch, um den Standort des Benutzers selbst herauszufinden, ohne das 'w 'Parameter in der Yahoo! URL.