Was ist der Unterschied zwischen sed und awk? [geschlossen]


497
  • Was ist der Unterschied zwischen awk und sed?
  • Welche Art von Anwendung sind die besten Anwendungsfälle für sed- und awk-Tools?

2
Eine verwandte QA zu unix.stackexchange: Gibt es ein grundlegendes Tutorial für grep, awk und sed?
Dani

Antworten:


549

sedist ein Stream-Editor. Es arbeitet mit Zeichenströmen pro Zeile. Es verfügt über eine primitive Programmiersprache, die Schleifen im Goto-Stil und einfache Bedingungen enthält (zusätzlich zum Muster- und Adressabgleich). Es gibt im Wesentlichen nur zwei "Variablen": Musterraum und Halteraum. Die Lesbarkeit von Skripten kann schwierig sein. Mathematische Operationen sind bestenfalls außerordentlich umständlich.

Es gibt verschiedene Versionen von sedmit unterschiedlichen Unterstützungsstufen für Befehlszeilenoptionen und Sprachfunktionen.

awkist zeilenweise auf begrenzte Felder ausgerichtet. Es hat viele robusten Programmierkonstrukte einschließlich if/ else, while, do/ whileund for(C-Stil und Array - Iteration). Es gibt vollständige Unterstützung für Variablen und eindimensionale assoziative Arrays sowie (IMO) kludgey mehrdimensionale Arrays. Mathematische Operationen ähneln denen in C. Sie haben printfund funktionieren. Das "K" in "AWK" steht für " K ernighan" wie in "Kernighan and Ritchie" des Buches "C Programming Language" (nicht zu vergessen A ho und W einberger). Man könnte möglicherweise einen Detektor für akademisches Plagiat mit schreiben awk.

GNU awk( gawk) verfügt über zahlreiche Erweiterungen, einschließlich echter mehrdimensionaler Arrays in der neuesten Version. Es gibt andere Variationen von awkeinschließlich mawkund nawk.

Beide Programme verwenden reguläre Ausdrücke zum Auswählen und Verarbeiten von Text.

Ich würde eher verwenden, sedwo es Muster im Text gibt. Sie können beispielsweise alle negativen Zahlen in einem Text in der Form "Minuszeichen gefolgt von einer Folge von Ziffern" (z. B. "-231,45") durch das Formular "Buchhalter in Klammern" (z. B. "(231,45)" ersetzen. ) mit diesem (was Raum für Verbesserungen gibt):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

Ich würde verwenden, awkwenn der Text eher wie Zeilen und Spalten oder, wie es sich awkbezieht, "Datensätze" und "Felder" aussieht . Wenn ich eine ähnliche Operation wie oben ausführen würde, aber nur im dritten Feld einer einfachen, durch Kommas getrennten Datei, könnte ich Folgendes tun:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Natürlich sind dies nur sehr einfache Beispiele, die nicht die gesamte Bandbreite der Funktionen veranschaulichen, die jeder bietet.


7
Einige Beispiele zum Überschreiten der Grenzen von sed: sed.sourceforge.net/#scripts
Bis auf weiteres angehalten.

@ TennisWilliamson - Bin ich im Nachteil, wenn ich nur awk lerne? Wird awk weitaus häufiger verwendet als sed?
Steam

4
@blasto: Meine Empfehlung ist, beides zu lernen, aber mit mehr Nachdruck auf awk. Viele der regulären Ausdrücke gelten sowohl für (als auch für andere Tools und Sprachen). Verwenden Sie sed für einfachere Dinge und versuchen Sie, die komplexen Dinge zu vermeiden. Es ist wirklich cool, dass Sie Schleifen und Verzweigungen in sed ausführen können, aber die resultierenden Befehlszeilen sind komplex und schwer zu lesen. Die Antwort auf Ihre Frage hängt wirklich davon ab, was Sie tun.
Bis auf weiteres angehalten.

@DennisWilliamson - Was wäre für einen ETL-Entwickler am nützlichsten? ETL oder Extract Transform and Load ist ein Data-Warehousing-Begriff. Grob gesagt umfasst der Job die EXTRAKTION von Daten aus verschiedenen unterschiedlichen Quellen (wie DBs, Excel-Dateien, CSV-Dateien usw.), die TRANSFORMATION derselben und das anschließende Laden in ein Data Warehouse (DW) zur Analyse, zum Auffinden von Mustern in Daten oder nur zum Verlauf Aufzeichnungen. z.B. Endverwendung eines DW - Algorithmen, die auf ein DW eines Lebensmittelgeschäfts angewendet werden, das Daten aus den letzten 10 Jahren enthält, können ergeben, dass Menschen, die dazu neigen, Äpfel zu kaufen, auch Orangen oder ähnliches kaufen.
Steam

1
Nur eine Information für alle, die auf einem Mac darüber stolpern, versuchen Sie "sed -Es / - ([0-9] +. [0-9] *) / (\ 1) / g '" für das erste sed-Beispiel
Daniel Schmidt

124

1) Was ist der Unterschied zwischen awk und sed?

Beide sind Werkzeuge, die Text transformieren. ABER awk kann mehr als nur Text manipulieren. Es ist eine Programmiersprache für sich, mit den meisten Dingen, die Sie beim Programmieren lernen, wie Arrays, Schleifen, wenn / sonst Flusskontrolle usw. Sie können auch in sed "programmieren", aber Sie möchten den darin geschriebenen Code nicht beibehalten .

2) Welche Art von Anwendung sind die besten Anwendungsfälle für sed- und awk-Tools?

Fazit: Verwenden Sie sed für eine sehr einfache Textanalyse. Alles darüber hinaus ist awk besser. In der Tat können Sie sed ganz wegwerfen und nur awk verwenden. Da sich ihre Funktionen überschneiden und awk mehr kann, verwenden Sie einfach awk. Sie werden auch Ihre Lernkurve reduzieren.


7
Netter Punkt über die Lernkurve .. zu viele Werkzeuge können sich verwechseln .. also würde ich es vorziehen, nur grep und awk zu lernen .. vergessen wir sed :)
Ausreißer

174
^^ Genug sed. (Entschuldigung, ich musste)
Greg M. Krsak

8
Ich finde, dass sed viel einfacher zu lernen ist, also musst du das berücksichtigen. Wenn Sie lernen, awk zu beherrschen, kann es nützlich sein, sed schnell zu lernen, um es schneller für Dinge verwenden zu können, die Sie in awk möglicherweise noch nicht wissen.
Didier A.

1
@ GregKrsak du hast meinen Tag gemacht. (Entschuldigung, ich musste)
Abel Callejo

15
Don't Ditch sed, 's/search/replace'ist viel einfacher zu tippen als awkdie Syntax und ist das, was Sie die meiste Zeit brauchen.
Sjas

54

Beide Werkzeuge sollen mit Text arbeiten und es gibt Aufgaben, für die beide Werkzeuge verwendet werden können.

Für mich lautet die Regel zum Trennen: Verwenden Sie seddiese Option, um Aufgaben zu automatisieren, die Sie sonst in einem Texteditor manuell ausführen würden. Deshalb wird es Stream- Editor genannt . (Sie können dieselben Befehle verwenden, um Text in vim zu bearbeiten.) Verwenden awkSie diese Option, wenn Sie Text analysieren, dh Felder zählen, Summen berechnen, Strukturen extrahieren und neu organisieren möchten usw.

Auch sollten Sie nicht vergessen grep. Verwenden grepSie diese Option, wenn Sie nur etwas in einem Text (einer Datei) suchen / extrahieren möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.