Zwei der am stärksten unterschätzten Linux-Utilities sind Sed und Awk. Obwohl sie zugegebenermaßen ein bisschen geheimnisvoll wirken können, wenn Sie sich wiederholende Änderungen an großen Teilen von Code oder Text vornehmen müssen, oder wenn Sie jemals etwas Text analysieren müssen, sind Sed und Awk von unschätzbarem Wert.
Also, was sind sie? Wie werden sie benutzt? Und wie vereinfachen sie die Textverarbeitung in Kombination?
Was ist Sed?
Sed wurde 1971 bei Bell Labs vom legendären Computerpionier Lee E. McMahon entwickelt.
Der Name steht für Stream-Editor, und das ist etwas, was es tut. Sie können Textkörper oder Textströme programmgesteuert bearbeiten, und zwar durch eine kompakte und einfache Turing-vollständige Programmiersprache.
Die Funktionsweise ist einfach: Sie liest Text zeilenweise in einen Puffer. Für jede Zeile führt sie gegebenenfalls die vordefinierten Anweisungen aus.
Zum Beispiel, wenn jemand ein Sed-Skript schreiben würde, das das Wort "Bier" durch "Soda" ersetzt und dann in einer Textdatei, die den gesamten Text enthält, an "99 Bottles of Beer on the Wall" übergeben würde, würde es gehen durch diese Datei auf einer Zeile für Zeile, und drucken Sie "99 Flaschen Soda an der Wand", und so weiter.
Das einfachste Sed-Skript ist Hello World. Hier verwenden wir das Unix-Echo-Dienstprogramm, das lediglich Strings ausgibt, um "Hello World" zu drucken. Aber wir schicken das an Sed und sagen ihm, dass wir "World" durch "Dave" ersetzen sollen. Selbsterklärendes Zeug.
echo "Hallo Welt" | sed s / welt / Dave
Sie können Sed-Anweisungen auch in Dateien kombinieren, wenn Sie eine kompliziertere Bearbeitung vornehmen müssen. Inspiriert von diesem urkomischen Reddit-Thread werde ich den Text zu A-Ha's Take On Me bringen und jede Instanz von "Ich", "Ich" und "Mein" durch Greg ersetzen.
Zuerst lege ich den Text in eine Textdatei namens tom.txt . Dann öffne ich meinen bevorzugten Texteditor (mein Favorit ist Vim. Die 7 besten Gründe, dem Vim Text Editor eine Chance zu geben. Die 7 besten Gründe dem Vim Text Editor eine Chance zu geben. Seit Jahren habe ich einen Texteditor ausprobiert ein anderes. Sie nennen es, ich habe es ausprobiert. Ich habe jeden einzelnen dieser Editoren für mehr als zwei Monate als meinen primären täglichen Redakteur benutzt. Irgendwie ... Read More, aber Nano nano vs vim: Terminal Text Editoren Verglichen Nano vim: Terminal Texteditoren im Vergleich Obwohl Linux für praktisch jeden Benutzer einfach zu benutzen ist, ohne das Terminal jemals benutzen zu müssen, gibt es einige von uns, die es regelmäßig benutzen oder neugierig sind, wie man es kontrollieren kann. Lesen Sie mehr und Gedit gedit: Einer der am meisten Feature-gefüllten Nur-Text-Editoren [Linux & Windows] gedit: Einer der am meisten Feature-gefüllten Nur-Text-Editoren [Linux & Windows] Wenn Sie an Klartext-Editoren denken, die erste Sache Das kann in Ihrem Kopf die Anwendung Notepad von Windows sein, die genau das tut, was in ihrer Jobbeschreibung steht - einfache Funktionen für einen einfachen Text ... Lesen Sie mehr sind beide ausgezeichnete Möglichkeiten), und fügen Sie die folgenden Zeilen hinzu. Stellen Sie sicher, dass die von Ihnen erstellte Datei mit .sed endet .
Sie werden feststellen, dass ich mich im obigen Beispiel wiederholt habe (zB s / me / Greg / und s / Me / Greg /). Das liegt daran, dass einige Versionen von Sed, wie die, die mit Mac OS X ausgeliefert wird, keine Übereinstimmung zwischen Groß- und Kleinschreibung unterstützt. Daher müssen wir für jedes Wort zwei Sed-Anweisungen schreiben, damit es die kapitalisierte und die unkapitalisierte Version erkennt.
Dies funktioniert nicht perfekt, als ob Sie jede Instanz von "Ich", "Ich" und "Mein" manuell ersetzt haben. Denken Sie daran, dass wir dies nur als Übung verwenden, um zu demonstrieren, wie Sie Sed-Befehle in einem Skript gruppieren und dann mit einem einzigen Befehl ausführen können.
Dann müssen wir die Datei aufrufen. Um dies zu tun, führen wir diesen Befehl aus.
Katze tom.txt | sed -f greg.sed
Lassen Sie uns verlangsamen und schauen, was das bewirkt. Adleraugen-Leser werden bemerkt haben, dass wir Echo hier nicht verwenden. Wir benutzen Cat. Denn während Cat den gesamten Inhalt der Datei ausgibt, druckt echo nur den Dateinamen aus. Sie werden auch bemerkt haben, dass wir Sed mit der "-f" -Flagge ausführen. Dadurch wird das Skript als Datei geöffnet.
Das Endergebnis ist dies.
Es ist auch erwähnenswert, dass Sed reguläre Ausdrücke (REGEX) unterstützt. Diese ermöglichen es Ihnen, Muster in Text zu definieren, indem Sie eine spezielle und komplizierte Syntax verwenden.
Hier ist ein Beispiel, wie das funktionieren könnte. Wir werden die oben erwähnten Songtexte nehmen, aber Regex verwenden, um jede Zeile auszudrucken, die nicht mit "Take" beginnt.
Katze tom.txt | sed / ^ Take / d
Sed ist natürlich unglaublich nützlich. Aber es ist noch mächtiger, wenn es mit Awk kombiniert wird.
Was ist Awk?
Awk, wie Sed, ist eine Programmiersprache, die für den Umgang mit großen Textkörpern entwickelt wurde. Aber während Sed zum Verarbeiten und Ändern von Text verwendet wird, wird Awk hauptsächlich als Werkzeug für Analyse und Berichterstellung verwendet .
Wie Sed wurde Awk in den 1970er Jahren bei Bell Labs entwickelt. Sein Name kommt nicht von dem, was das Programm tut, sondern von den Nachnamen der Autoren - Alfred Aho, Peter Weinberger und Brian Kernaghan.
Awk funktioniert, indem eine Textdatei oder ein Eingabestream Zeile für Zeile gelesen wird. Jede Zeile wird gescannt, um festzustellen, ob sie einem vordefinierten Muster entspricht. Wenn eine Übereinstimmung gefunden wird, wird eine Aktion ausgeführt.
Aber während Sed und Awk ähnliche Ziele verfolgen, sind sie zwei völlig verschiedene Sprachen mit zwei völlig unterschiedlichen Design-Philosophien. Awk ähnelt mehr als einige allgemeine Sprachen Wie wählt man eine Programmiersprache, um heute zu lernen und einen guten Job in 2 Jahren Wie wählen Sie eine Programmiersprache, um heute zu lernen und einen guten Job in 2 Jahren Es kann Jahre der engagierten Arbeit zu nehmen werde ein wirklich guter Programmierer; Gibt es also eine Möglichkeit, die richtige Sprache zu wählen, um von heute an zu beginnen, um morgen eingestellt zu werden? Lesen Sie mehr, wie C, Python und Bash. Es hat Dinge wie Funktionen und eine C-ähnliche Herangehensweise an Dinge wie Iteration und Variablen (James Bruce erklärte, wie Iteration funktioniert. Die absoluten Grundlagen der Programmierung für Anfänger (Teil 2) Die absoluten Grundlagen der Programmierung für Anfänger (Teil 2) Teilweise 2 unserer absoluten Anfänger Anleitung zum Programmieren, werde ich die Grundlagen der Funktionen, Rückgabewerte, Schleifen und Bedingungen zu behandeln. Stellen Sie sicher, dass Sie Teil 1 gelesen haben, bevor Sie dies angehen, wo ich die ... Lesen Sie weiter). Einfach gesagt, es fühlt sich mehr wie eine Programmiersprache an.
Also, lasst es uns ausprobieren. Mit dem Songtext von Take On Me werden wir alle Zeilen drucken, die länger als 20 Zeichen sind.
awk 'Länge ($ 0)> 80' tom.txt
Das nächste Beispiel habe ich schamlos aus der offiziellen Awk-Dokumentation abgeschrieben. Aber es ist ein großartiges Beispiel für das Potenzial dieser kraftvollen und doch winzigen Sprache. Es ist auch eine großartige Demonstration, wie Dinge wie Iteration und Variablen darin arbeiten. Erstellen Sie zuerst eine Datei namens "WordCount.awk", und fügen Sie die folgenden Zeilen hinzu.
{für (i = 1; i <= NF; i ++) freq [$ i] ++}
END {für (Wort in Häufigkeit) printf "% s \ t% d \ n", Wort, Häufigkeit [Wort]}
Speichern Sie es und führen Sie es dann mit dem folgenden Befehl aus.
awk -f WordCount.awk tom.txt
Cool, oder? Sie werden wahrscheinlich feststellen, dass sie nicht in einer bestimmten Reihenfolge sind. Sie können die Ergebnisse mithilfe des Unix-Sortierungsprogramms sortieren. Aber wir werden das für einen anderen Tag verlassen. Wir werden es einfach halten.
Die zwei kombinieren
Awk und Sed sind beide unglaublich mächtig, wenn sie kombiniert werden. Sie können dies tun, indem Sie Unix-Pipes verwenden. Das sind die "|" Bits zwischen Befehlen.
Lass es uns versuchen: Wir werden alle Zeilen in Take On Me auflisten, die mehr als 20 Zeichen enthalten, mit Awk. Dann werden wir alle Zeilen entfernen, die mit "Take" beginnen . Zusammen sieht alles so aus:
awk 'Länge ($ 0)> 20' tom.txt | sed / ^ Take / d
Und produziert das:
Lasst uns das umdrehen. Wir werden damit beginnen, alle Zeilen zu entfernen, die mit Take beginnen, und sie dann nach Awk zu leiten, wo wir zählen, wie oft jedes Wort erscheint. Es sieht ein bisschen so aus:
Katze tom.txt | sed / ^ Take / d | awk -f WordCount.awk
Die Macht von Sed und Awk
Es gibt nur so viel, was du in einem einzigen Artikel erklären kannst. Aber ich hoffe, ich habe illustriert, wie unermesslich kraftvoll Sed und Awk sind. Einfach gesagt, sie sind ein Textverarbeitungs-Kraftwerk.
Also, warum sollte es dich interessieren? Abgesehen von der Tatsache, dass Sie nie wissen, wann Sie vorhersehbare, sich wiederholende Änderungen an einem Textdokument vornehmen müssen, eignen sich Sed und Awk hervorragend zum Analysieren von Protokolldateien. Dies ist besonders praktisch, wenn Sie versuchen, ein Problem in Ihrem LAMP-Server zu beheben, angemeldet für SSH-only Web Hosting? Machen Sie sich keine Sorgen - Leicht zu installieren jede Web-Software für SSH-only Web Hosting angemeldet? Machen Sie sich keine Sorgen - Einfache Installation von Web-Software Sie wissen nicht, was Linux als erstes über seine leistungsstarke Befehlszeile angeht? Mach dir keine Sorgen mehr. Lesen Sie mehr oder sehen Sie sich Ihre Zugriffsprotokolle an, um zu sehen, ob Ihr Server gehackt wurde.
Hast du einen interessanten Einsatz für Sed und Awk gefunden? Gibt es andere Linux-Programme, die Ihrer Meinung nach unterschätzt werden? Lass es mich in den Kommentaren unten wissen und wir werden uns unterhalten.