Was sind die Unterschiede zwischen Perl, Python, AWK und sed? [geschlossen]


253

Ich möchte nur wissen, was die Hauptunterschiede zwischen ihnen sind. und die Kraft jeder Sprache (wo es besser ist, sie zu benutzen).

Bearbeiten: Es ist nicht "vs." wie Thema, nur Informationen.


142
Diese Art von sogenannten unkonstruktiven Fragen ist wirklich hilfreich.
Steam

10
Sicher, ein Tab auf der Titelseite, um sie zu finden, wäre praktisch ...

Informationen zur Nützlichkeit von Python in der Befehlszeile finden Sie unter pyp
Neil McGuigan

Antworten:


550

In der Reihenfolge des Erscheinens, die Sprachen sind sed, awk, perl, python.

Das sedProgramm ist ein Stream-Editor und dient zum Anwenden der Aktionen eines Skripts auf jede Zeile (oder allgemeiner auf bestimmte Zeilenbereiche) der Eingabedatei oder der Eingabedateien. Seine Sprache basiert auf eddem Unix-Editor, und obwohl er Bedingungen usw. hat, ist es schwierig, mit komplexen Aufgaben zu arbeiten. Sie können damit kleine Wunder vollbringen - aber zu einem Preis für die Haare auf Ihrem Kopf. Es ist jedoch wahrscheinlich das schnellste Programm, wenn Aufgaben in seinem Zuständigkeitsbereich ausgeführt werden. (Es hat die am wenigsten leistungsfähigen regulären Ausdrücke der besprochenen Programme - für viele Zwecke geeignet, aber sicherlich nicht PCRE - Perl-kompatible reguläre Ausdrücke)

Das awkProgramm (Name aus den Initialen seiner Autoren - Aho, Weinberger und Kernighan) ist zunächst ein Werkzeug zum Formatieren von Berichten. Es kann als Suppe verwendet werden sed; In den neueren Versionen ist es rechnerisch vollständig. Es verwendet eine interessante Idee - das Programm basiert auf "übereinstimmenden Mustern" und "Aktionen, die durchgeführt werden, wenn das Muster übereinstimmt". Die Muster sind ziemlich mächtig (Extended Regular Expressions). Die Sprache für die Aktionen ähnelt C. Eine der Hauptfunktionen von awkist, dass die Eingabe automatisch in Datensätze und jeder Datensatz in Felder aufgeteilt wird.

Perl wurde teilweise als Awk-Killer und Sed-Killer geschrieben. Zwei der Programme mit vorgesehen sind a2pund s2pfür die Umwandlung von awkSkripten und sedSkripte in Perl. Perl ist eine der frühesten Skriptsprachen der nächsten Generation (Tcl / Tk kann wahrscheinlich den Vorrang beanspruchen). Es verfügt über eine leistungsstarke integrierte Behandlung regulärer Ausdrücke mit einer weitaus leistungsstärkeren Sprache. Es bietet Zugriff auf fast alle Systemaufrufe und verfügt über die Erweiterbarkeit der CPAN-Module. (Weder awknoch sederweiterbar.) Eines von Perls Mottos ist "TMTOWTDI - Es gibt mehr als einen Weg, dies zu tun" (ausgesprochen "tim-toady"). Perl hat 'Objekte', aber es ist eher ein Add-On als ein grundlegender Teil der Sprache.

Python wurde zuletzt geschrieben und wahrscheinlich teilweise als Reaktion auf Perl. Es hat einige interessante syntaktische Ideen (Einrückung zur Angabe von Ebenen - keine geschweiften Klammern oder Äquivalente). Es ist grundlegender objektorientiert als Perl; Es ist genauso erweiterbar wie Perl.

OK - wann jeweils zu verwenden?

  • Sed - wenn Sie einfache Texttransformationen für Dateien durchführen müssen.
  • Awk - wenn Sie nur eine einfache Formatierung und Zusammenfassung oder Transformation von Daten benötigen.
  • Perl - für fast jede Aufgabe, besonders wenn die Aufgabe komplexe reguläre Ausdrücke benötigt.
  • Python - für dieselben Aufgaben, für die Sie Perl verwenden könnten.

Mir ist nichts bekannt, was Perl kann, was Python nicht kann, und umgekehrt. Die Wahl zwischen den beiden würde von anderen Faktoren abhängen. Ich habe Perl gelernt, bevor es Python gab, daher benutze ich es eher. Python hat eine weniger akkreditierte Syntax und ist im Allgemeinen etwas einfacher zu erlernen. Perl 6 wird, sobald es verfügbar ist, eine faszinierende Entwicklung sein.

(Beachten Sie, dass insbesondere die 'Übersichten' von Perl und Python absolut unvollständig sind; ganze Bücher könnten zu diesem Thema geschrieben werden.)


82
Ein ++++ Beitrag, würde wieder lesen!
Robert Gamble

24
Genial, besonders "wann man jeden Teil benutzt"
Khaled Al Hourani

6
Beachten Sie, dass der Zen von Python im Grunde das Gegenteil von TMTOWTDI ist, also würde ich sagen, dass es eine Reaktion auf Perl sein könnte. iirc TCL war etwas nach Perl und ist auch ziemlich reaktionär gegenüber Perl, obwohl TCLs Reaktion in Syntax und Sprachkomplexität liegt, nicht in Möglichkeiten, Dinge zu tun
jk.

7
Unabhängig von den ursprünglichen Absichten ist klar, dass die spätere Python-Entwicklung und die Python-Community die Lesbarkeit und Konsistenz der flexibleren, aber knappen Syntax von Perl vorgezogen haben. Ausgezeichnete Post Jonathan
Martin Beckett

4
@blasto: Für ETL, würde ich priorisieren awküber sedfür das Lernen (obwohl beide noch ihre Verwendungen haben). In Bezug auf die Größe der Aufgabe: sedIst am besten, wenn eine Zeile nach der anderen verarbeitet wird, ohne dass von Zeile zu Zeile gespeichert wird. awkwird häufig verwendet, um assoziative Arrays mit Daten aufzubauen, die aus allen Quellen stammen. Es benötigt mehr Speicher und tritt daher viel häufiger mit großen Datenmengen auf als bisher sed. Ich habe noch nie davon gehört, tsawkbevor Sie darauf verlinkt haben. Ich greife eher auf Perl zurück (aber mit Python können Sie es besser machen), wenn eine Aufgabe zu viel ist awk.
Jonathan Leffler

91

Nachdem Sie ein paar Dutzend Sprachen beherrschen, werden Sie müde von Leuten wie S. Lott (siehe seine kontroverse Antwort auf diese Frage, fast halb so viele Abstimmungen wie oben (+ 45 / -22) sechs Jahre nach der Beantwortung).

Sed ist das beste Tool für extrem einfache Befehlszeilen-Pipelines. In den Händen eines Sed-Masters eignet es sich für Unikate beliebiger Komplexität, sollte jedoch nur in sehr einfachen Substitutions-Pipelines im Produktionscode verwendet werden. Sachen wie 's / dies / das /.'

Gawk (das GNU awk) ist bei weitem die beste Wahl für die komplexe Neuformatierung von Daten, wenn nur eine einzige Eingabequelle und eine einzelne Ausgabe vorhanden sind (oder mehrere Ausgaben nacheinander geschrieben werden). Da dieser Beschreibung viel Arbeit in der Praxis entspricht und ein guter Programmierer in zwei Stunden Gawk lernen kann, ist dies die beste Wahl. Einfacher und schneller ist auf diesem Planeten besser!

Perl oder Python sind weitaus besser als jede Version von awk oder sed, wenn Sie sehr komplexe Eingabe- / Ausgabeszenarien haben. Je komplexer das Problem ist, desto besser ist es für Sie, Python zu verwenden, was Wartung und Lesbarkeit betrifft. Beachten Sie jedoch, dass ein guter Programmierer lesbaren Code in jeder Sprache schreiben kann und ein schlechter Programmierer nicht wartbaren Mist in jeder nützlichen Sprache schreiben kann, so dass die Wahl von Perl oder Python sicher den Vorlieben des Programmierers überlassen werden kann, wenn dies der Programmierer ist geschickt und klug.


9
100% stimmten zu. Die meisten, wenn nicht alle Werkzeuge zu kennen UND wann sie zu verwenden sind, unterscheidet einen guten Techniker von einem mittelmäßigen.
Ata

6
Ich werde hinzufügen, dass ein weiterer Grund, Python oder Perl anstelle von awk zu wählen, darin besteht, dass Ihre Transformationsanforderungen eine komplexe Validierung oder Logik beinhalten, für die eine andere Sprache ein vorhandenes, robustes Modul hat. Überlegen Sie, was erforderlich ist, um z. B. E-Mail- oder Straßenadressen in awk richtig zu handhaben, und Sie werden sehen, was ich meine: Perl und Python haben Bibliotheken, die solche Dinge trivial machen. In awk sind diese ungewöhnlich oder nicht verfügbar.
Sorpigal

3
Eigentlich als Perl entworfen wurde, um sowohl Sed als auch Awk zu umfassen; Ich finde es einfacher, es einfach in Perl zu schreiben, als Sed oder Awk zu lernen.
Brad Gilbert

@BradGilbert: Wie ich gerade in der oberen Antwort erwähnt habe, ist eine Einschränkung von Perl (& Python, Ruby usw.) gegenüber awk, dass eine Art von Regexp in der ersteren reaaaaaaaaaally langsamer ist: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac

1
@OlivierDulac Ja, das zeigt einen pathologischen Fall. Wenn Sie von a?ⁿaⁿbis wechseln , a??ⁿaⁿführen Sie dies in Perl 5 mit einem Wert von 1.000.000 in weniger als zwei Sekunden aus. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Wenn Sie die naive Version ausführen, dauert es mehr als zwei Sekunden für eine von nur 25. Sie müssen feststellen, dass Perl mehr Regex-Funktionen als die schnelleren bietet, einschließlich der Möglichkeit, Perl-Code in der Regex zu haben, der die Übereinstimmung ändert . Sie können ein Modul implementieren, das das integrierte Modul gegen eines dieser anderen austauscht, wenn Sie möchten.
Brad Gilbert

21

Ich würde sed nicht als vollwertige Programmiersprache bezeichnen, sondern als Stream-Editor mit Sprachkonstrukten, die darauf abzielen, Textdateien programmgesteuert zu bearbeiten.

Awk ist eher eine Allzwecksprache, eignet sich aber dennoch am besten für die Textverarbeitung.

Perl und Python sind vollwertige Allzweck-Programmiersprachen. Perl hat seine Wurzeln in der Textverarbeitung und verfügt über eine Reihe von awk-ähnlichen Konstrukten (es gibt sogar ein awk-zu-Perl-Skript im Netz). Es gibt viele Unterschiede zwischen Perl und Python. Am besten lesen Sie wahrscheinlich die Zusammenfassungen beider Sprachen in Wikipedia, um einen guten Überblick zu erhalten.


2
Ich habe eine sed-Implementierung von Sokoban gesehen, die Turing Completeness implizieren würde. Dies gilt jedoch auch für sendmail.cf und TeX.
ConcernedOfTunbridgeWells

7
Ich habe einmal mit einem Mann zusammengearbeitet, der PostScript geschrieben hat, um aus einem Laserdrucker einen Router zu machen.
Sam Kington

10
@ Sam: Wow! Ich wusste nicht, dass der Laser eines Druckers so hochgedreht werden kann, dass Holz geschnitten werden kann! Oh, sorry, falscher Router.
Bis auf weiteres angehalten.

2
sed, keine vollwertige Sprache? Nun, das ist nicht ganz richtig, da sed komplett ist ;)
bernard paulus

1
Ich habe eine Implementierung der vierten Sprache in awk gesehen. (Da awk als eigenständiger Parser angesehen werden kann, ist es ziemlich einfach, einen Interpreter darin zu implementieren.)
Tatjana Heuser

19

Erstens gibt es zwei nicht miteinander verbundene Dinge in der Liste "Perl, Python awk und sed".

Sache 1 - vereinfachte Textmanipulationswerkzeuge.

  • sed. Es hat einen festen, relativ einfachen Arbeitsumfang, der durch die Idee definiert wird, jede Zeile einer Datei zu lesen und zu untersuchen. sed ist nicht besonders lesbar. Es ist so konzipiert, dass es auf sehr kleinen Unix-Servern sehr klein und sehr effizient ist.

  • awk. Es hat einen etwas weniger festen, weniger einfachen Arbeitsumfang. Die Hauptschleife eines awk-Programms wird jedoch durch das implizite Lesen von Zeilen einer Quelldatei definiert.

Dies sind keine "vollständigen" Programmiersprachen. Während Sie - mit etwas Arbeit - ziemlich anspruchsvolle Programme in awk schreiben können, wird es schnell kompliziert und schwer zu lesen.

Sache 2 - Allgemeine Programmiersprachen. Diese verfügen über eine Vielzahl von Anweisungstypen, zahlreiche integrierte Datenstrukturen und keine nennenswerten Annahmen oder Verknüpfungen.

  • Perl.

  • Python.

Wann man sie benutzt.

  • sed. Noch nie. In der modernen Ära von Computern mit mehr als 32 KB Speicher hat es wirklich keinen Wert. Perl oder Python machen die gleichen Dinge klarer.

  • awk. Noch nie. Wie sed spiegelt es eine frühere Ära des Rechnens wider. Anstatt diese Sprache beizubehalten (zusätzlich zu allen anderen, die für ein erfolgreiches System erforderlich sind), ist es angenehmer, einfach alles in einer angenehmen Sprache zu tun.

  • Perl. Jedes Programmierproblem jeglicher Art. Wenn Sie eine frei denkende Syntax mögen, bei der es viele, viele Möglichkeiten gibt, dasselbe zu tun, macht Perl Spaß.

  • Python. Jedes Programmierproblem jeglicher Art. Wenn Sie eine ziemlich eingeschränkte Syntax mögen, bei der es weniger Auswahlmöglichkeiten, weniger Subtilität und (vielleicht) mehr Klarheit gibt. Aufgrund seiner objektorientierten Natur eignet sich Python besser für große, komplexe Probleme.

Hintergrund - Ich schlage nicht sed und erwache aus Unwissenheit. Ich habe vor über 20 Jahren awk gelernt. Hat viele Dinge damit gemacht; verwendet, um es als Kern-Unix-Fähigkeit zu lehren. Ich habe Perl vor ungefähr 15 Jahren gelernt. Habe viele raffinierte Dinge damit gemacht. Ich habe beide zurückgelassen, weil ich in Python die gleichen Dinge tun kann - und es ist einfacher und klarer.

Es gibt zwei schwerwiegende Probleme mit sed und awk, von denen keines ihrem Alter entspricht.

  1. Die Unvollständigkeit ihrer Umsetzung. Alles, was sed und awk tun, kann in Python oder Perl erledigt werden, oft einfacher und manchmal auch schneller. Eine Shell-Pipeline bietet aufgrund ihrer Mehrfachverarbeitung einige Leistungsvorteile. Python bietet ein subprocessModul, mit dem ich diese Vorteile wiederherstellen kann.

  2. Die Notwendigkeit, noch eine andere Sprache zu lernen. Wenn Sie in Python (oder Perl) arbeiten, hängt Ihre Implementierung von weniger Sprachen ab, was zu einer höheren Klarheit führt.


66
Einige ziemlich fette Argumente gegen awk / sed. Der verstellbare Schraubenschlüssel hat den offenen Schraubenschlüssel aus dem gleichen Grund nicht ersetzt. Sed und awk versenden immer noch. Manchmal ist das einfache Werkzeug das Beste für den Job. Ich schreibe viel Perl, aber für eine einfache Kette von Pipe-Befehlen sind awk / sed schneller als perl -e
RET

27
Auf den meisten Nicht-Linux-Unix-Systemen kann nicht davon ausgegangen werden, dass nur sh, sed und awk verfügbar sind. Wenn Sie möchten, dass bei einer sofort einsatzbereiten Solaris-, HP / UX- oder AIX-Installation etwas funktioniert, bleiben Sie bei sed und awk.
ConcernedOfTunbridgeWells

27
Die Hälfte meiner Shell-Skripte verwendet entweder sed oder awk. Sie sind alles andere als tot. Python ist meine bevorzugte Skriptsprache, aber manchmal sind sed und awk das beste Werkzeug für diesen Job. Nur weil sie seit vielen Jahren im Einsatz sind, heißt das nicht, dass sie veraltet sind.
Jeremy Cantrell

16
@ S.Lott: Ich schlage nicht vor, dass jemand versuchen sollte, eine Web-App in awk zu erstellen, aber zu sagen, dass sie niemals verwendet werden sollten, ist ein bisschen empörend. Für ein einfaches S & R und / oder Tweak (insbesondere für eine begrenzte Textdatei) wird Perl -e oder Python -c niemals so effizient sein wie ein Sed / Awk-Einzeiler.
RET

25
Ich mag solche Antworten nicht. Sed und awk sind in wenigen Stunden leicht zu verstehen und viel leichter und weit verbreiteter als eine vollwertige Sprache. Die Shell-Programmierung ist nach wie vor relevant. Wenn Sie "NIE" verwenden, wird dieses oder jenes Tool einfach verzögert. Aber war diese verzögerte Idee nicht eine der Grundlagen, auf denen Perl entstand? Oh well--
ata

14

Wann man sie benutzt: awk - nie - S. Lott.

Ich denke, S. Lott hat mit dieser Empfehlung die Marke leicht verfehlt. Tatsache ist, dass awk unter Linux und anderen UNIX-Umgebungen ein nützliches Tool ist, das mit bash, sh und ksh für eine schnelle Textverarbeitung verwendet werden kann. Die Idee des Skripts selbst ist, dass Sie Ihr Problem lösen, indem Sie dieses Werkzeug, dieses Werkzeug, zusammenkleben. Daher ist es in Administrationsskripten üblich, ls, grep, |, awk, time, ps usw. zu haben. Jedes ist ein Werkzeug, das der Scripter wie ein Builder Stein für Stein kombiniert, um das Gebäude fertigzustellen (um das vorliegende Problem zu lösen). .

Zum Beispiel bin ich ein Teammitglied des Teams, das Paintball-Ausrüstung verwaltetdotcom. Diese E-Commerce-Site basiert auf dem LAMP-Stack. Für die automatisierte Verarbeitung und Normalisierung von Datenfeeds von verschiedenen Lieferanten in die Back-End-Datenbank verwenden und pflegen wir einen diversifizierten Mix von Skripten, einschließlich Bash, Perl, PHP und sogar Expect. Jedes hat seine Stärken basierend auf den verfügbaren Modulen und der API. In den Bash-Skripten führen wir mit awk eine schnelle Musterübereinstimmung und entsprechende Aktionen für die Muster nach Bedarf durch, ohne zu PERL wechseln zu müssen. Eine Sache, auf die ich auch hinweisen möchte, die im Thread nicht hervorgehoben wurde, ist, dass eine ganze Reihe dieser Skripte gekauft oder von Open Source bezogen wurden. Wenn das Skript als Perl geliefert wurde, behalten wir es als Perl bei. Wenn das Skript als Php geliefert wurde, behalten wir es als Php bei. Wenn es als Bash kam, behalten wir es als Bash bei.


7
es war S.Lott, der diese Antwort schrieb, die Sie zitiert haben, nicht brian d foy ...
plusplus

5
als Randnotiz zu dieser ziemlich alten Antwort: Analysieren Sie niemals die Ausgabe von ls, verwenden Sie stattdessen glob. lesen Sie dies.
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.