it-swarm.com.de

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

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

Edit: es ist nicht "vs." wie Thema, nur Information.

241

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

Das Programm sed ist ein Stream-Editor, mit dem die Aktionen eines Skripts auf jede Zeile (oder allgemeiner auf bestimmte Zeilenbereiche) der Eingabedatei oder -dateien angewendet werden. Seine Sprache basiert auf ed, dem Unix-Editor, und obwohl es Bedingungen usw. gibt, ist es schwierig, mit diesen für komplexe Aufgaben zu arbeiten. Sie können damit kleine Wunder vollbringen - aber zu Lasten der Haare auf Ihrem Kopf. Es ist jedoch wahrscheinlich das schnellste Programm, wenn es darum geht, Aufgaben in seinem Zuständigkeitsbereich auszuführen. (Es hat die wenigsten regulären Ausdrücke der besprochenen Programme - ausreichend für viele Zwecke, aber sicher nicht PCRE - Perl-kompatible reguläre Ausdrücke)

Das Programm awk (Name aus den Initialen seiner Autoren - Aho, Weinberger und Kernighan) ist ursprünglich ein Werkzeug zum Formatieren von Berichten. Es kann als Suppe verwendet werden sed; In seinen neueren Versionen ist es rechnerisch vollständig. Es verwendet eine interessante Idee - das Programm basiert auf "Mustern, die übereinstimmen" und "Aktionen, die ausgefü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 wichtigsten Eigenschaften von awk ist, dass die Eingabezeilen automatisch in Felder aufgeteilt werden.

Perl wurde teilweise als awk-killer und sed-killer geschrieben. Zwei der mitgelieferten Programme sind a2p und s2p zum Konvertieren von awk Skripten und sed Skripten 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 wesentlich leistungsfähigeren Sprache. Es bietet Zugriff auf fast alle Systemaufrufe und verfügt über die Erweiterbarkeit der CPAN-Module. (Weder awk noch sed sind erweiterbar.) Ein Motto von Perl lautet "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, um Ebenen anzuzeigen - keine geschweiften Klammern oder Äquivalente). Es ist grundlegender objektorientiert als Perl; es ist genauso erweiterbar wie Perl.

OK - wann soll ich welche 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 die gleichen Aufgaben, für die Sie Perl verwenden könnten.

Mir ist nichts bewusst, was Perl dazu in der Lage ist Python kann es nicht, und umgekehrt. Die Wahl zwischen beiden hängt von anderen Faktoren ab. Ich habe Perl gelernt, bevor es Python gab. Daher benutze ich es in der Regel. Python hat eine weniger vertraute 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' zu Perl und Python absolut unvollständig sind; ganze Bücher könnten zu diesem Thema geschrieben werden.)

529

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

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

Gawk (das GNU awk) ist bei weitem die beste Wahl für die Neuformatierung komplexer Daten, wenn nur eine einzige Eingabequelle und eine einzige Ausgabe (oder mehrere Ausgaben, die nacheinander geschrieben werden) vorhanden sind. Da dieser Beschreibung eine Menge realer Arbeit 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, Python zu verwenden, was Wartung und Lesbarkeit betrifft. Beachten Sie jedoch, dass ein guter Programmierer lesbaren Code in einer beliebigen Sprache schreiben kann und ein schlechter Programmierer in einer beliebigen nützlichen Sprache nicht verwaltbaren Mist schreiben kann, sodass die Wahl von Perl oder python sicher den Vorlieben des Programmierers überlassen werden kann wenn der Programmierer geschickt und klug ist.

89
Charlie

Erstens gibt es in der Liste "Perl, Python awk and sed" zwei Dinge, die nichts miteinander zu tun haben.

Sache 1 - vereinfachte Textbearbeitungswerkzeuge.

  • sed. Es hat einen festen, relativ einfachen Arbeitsumfang, der durch die Idee definiert ist, 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 einigem Aufwand - ziemlich ausgefeilte Programme in awk schreiben können, wird es schnell kompliziert und schwer zu lesen.

Sache 2 - Programmiersprachen für allgemeine Zwecke. 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. Es hat in der modernen Ära der Computer mit mehr als 32 KB Speicher wirklich keinen Wert. Perl oder Python machen die gleichen Dinge deutlicher.

  • 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. Beliebige Programmierprobleme 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. Beliebige Programmierprobleme jeglicher Art. Wenn Sie eine ziemlich eingeschränkte Syntax bevorzugen, bei der es weniger Auswahlmöglichkeiten, weniger Feinheit und (vielleicht) mehr Klarheit gibt. Pythons objektorientierte Natur macht es besser für große, komplexe Probleme geeignet.

Hintergrund - Ich schlage nicht aus Unwissenheit. Ich habe awk vor über 20 Jahren gelernt. Habe 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 die gleichen Dinge in Python tun kann - und es ist einfacher und klarer.

Es gibt zwei ernsthafte Probleme mit sed und awk, von denen keines in ihrem Alter ist.

  1. Die Unvollständigkeit ihrer Umsetzung. Alles, was sed und awk tun, kann in Python oder Perl ausgeführt werden, oft einfacher und manchmal auch schneller. Eine Shell-Pipeline bietet aufgrund ihrer Mehrfachverarbeitung einige Leistungsvorteile. Python bietet ein subprocess -Modul, 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, wodurch die Übersichtlichkeit erhöht wird.

21
S.Lott

Ich würde sed nicht als vollwertige Programmiersprache bezeichnen, es ist ein Stream-Editor mit Sprachkonstrukten, die darauf abzielen, Textdateien programmatisch zu bearbeiten.

Awk ist eine etwas allgemeinere Sprache, eignet sich jedoch am besten für die Textverarbeitung.

Perl und Python sind vollwertige Programmiersprachen. Perl hat seine Wurzeln in der Textverarbeitung und verfügt über eine Reihe von awk-ähnlichen Konstrukten (es gibt sogar ein awk-to-Perl-Skript, das im Umlauf ist Es gibt viele Unterschiede zwischen Perl und Python. Am besten lesen Sie die Zusammenfassungen beider Sprachen in etwas wie Wikipedia, um einen guten Überblick zu bekommen, was sie sind.

20
Robert Gamble

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

Ich denke, S. Lott hat mit dieser Empfehlung die Marke leicht verfehlt. Tatsache ist, dass awk unter Linux und in anderen UNIX-Umgebungen ein nützliches Tool ist, das mit bash, sh und ksh für die schnelle Textverarbeitung verwendet werden kann. Die Idee des Skripts selbst ist, dass Sie Ihr Problem lösen, indem Sie dieses Tool, dieses Tool, zusammenkleben. Daher ist es in Administrationsskripten üblich, ls, grep, |, awk, time, ps usw. zu haben. Jedes Tool wird vom 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 dotcom verwaltet. Diese E-Commerce-Site basiert auf dem LAMP-Stack. Für die automatisierte Verarbeitung und Normalisierung von Datenfeeds von verschiedenen Anbietern in die Back-End-Datenbank verwenden und verwalten wir einen abwechslungsreichen Mix von Skripten, einschließlich Bash, Perl, PHP und sogar Expect. Jedes hat seine Stärken, die auf den verfügbaren Modulen und der API basieren. In den Bash-Skripten führen wir mithilfe von awk einen schnellen Musterabgleich und entsprechende Aktionen für die Muster 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 kam, pflegen wir es als PHP; Wenn es als Bash kam, behalten wir es als Bash bei. Wir schreiben es nicht in einer anderen Sprache um, nur weil wir denken, dass es in der Originalsprache weniger effizient ist.

12
tao quam