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.
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.
Antworten:
In der Reihenfolge des Erscheinens, die Sprachen sind sed
, awk
, perl
, python
.
Das sed
Programm 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 ed
dem 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 awk
Programm (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 awk
ist, 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 a2p
und s2p
für die Umwandlung von awk
Skripten und sed
Skripte 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 awk
noch sed
erweiterbar.) 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?
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.)
awk
über sed
für das Lernen (obwohl beide noch ihre Verwendungen haben). In Bezug auf die Größe der Aufgabe: sed
Ist am besten, wenn eine Zeile nach der anderen verarbeitet wird, ohne dass von Zeile zu Zeile gespeichert wird. awk
wird 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, tsawk
bevor 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
.
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.
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.
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.
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.
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 subprocess
Modul, mit dem ich diese Vorteile wiederherstellen kann.
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.
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.
ls
, verwenden Sie stattdessen glob. lesen Sie dies.