Gibt es noch einen Grund, AWK zu lernen?

109

Ich lerne ständig neue Werkzeuge, auch altmodische, weil ich gerne die richtige Lösung für das Problem verwende.

Trotzdem frage ich mich, ob es noch einen Grund gibt, einige davon zu lernen. awkzum Beispiel ist interessant für mich, aber für einfache Textverarbeitung, kann ich grep, cut, sedetc. , während für komplexe, werde ich für Python gehen.

Jetzt meine ich nicht, dass es kein mächtiges und handliches Werkzeug ist. Aber da es Zeit und Energie braucht, um ein neues Werkzeug zu lernen, lohnt es sich ?

e-satis
quelle
2
Es ist 2019 und ich habe gerade einen Python Log Normalizer in awk umgeschrieben. Ich habe die Transformation für eine Woche mit Protokolldateien ausgeführt, die 54 Millionen Zeilenprotokolldateien (~ 9 GB) enthielten. Auf meinem Macbook Pro (2,8 GHz i7, 16 GB RAM) konnte die Python-Version ~ 10.000 Zeilen pro Sekunde verarbeiten => 90 Minuten Laufzeit. Mit mawk wurde die Laufzeit auf 2 Minuten reduziert. Übrigens war das awk-Programm halb so groß.
Mistahenry
@mistahenry hast du Pypy probiert?
qwr

Antworten:

97

Ich denke, es hängt von der Umgebung ab, in der Sie sich befinden. Wenn Sie eine * nix-Person sind, dann ist Wissen awkeine gute Sache. Die einzige andere Skriptumgebung, die auf praktisch jedem * nix zu finden ist, ist sh. Während also grep, sed,etc sicher ersetzen awkauf einer modernen Mainstream - linuxDistribution, wenn Sie exotischere Systeme bewegen, zu wissen , ein wenig awkwirklich praktisch sein wird.

awkkann auch für mehr als nur Textverarbeitung verwendet werden. Zum Beispiel einer meiner Vorgesetzten schreibt Astronomie Code in awk- das ist wie ganz alte Schule und genial er ist. Damals war es das beste Werkzeug für diesen Job ... und jetzt, obwohl seine Schüler wie ich Python verwenden und was nicht, bleibt er bei dem, was er weiß und gut funktioniert.

Abschließend gibt es eine Menge alten Codes auf der ganzen Welt, der weiß, dass ein bisschen awknicht schaden wird. Es wird dich auch besser machen * nix Person :-)

Freiraum
quelle
12
++ Einverstanden, awk ist wirklich eines der portabelsten und vor allem konsistentesten Tools im * nix-Toolset. Es funktioniert beispielsweise zuverlässig auf einer Busybox, bei der Perl nirgends zu finden ist.
Waffen
1
Und es ist auch nicht so schwer zu lernen, wenn man es gewohnt ist, Sprachen zu lockigen
Waffen
2
"In jeder Umgebung ist es das Gleiche" - nicht ganz: Unter Windows müssen einfache Anführungszeichen durch double, s und interne double ersetzt werden. (Windows ist eine Art echte Umgebung, auch wenn Sie sich Redmonds unsicherer, halbfertiger Gräueltat aussetzen und einem russischen 15-Jährigen ausgeliefert sind.)
GT.
6
Ich glaube nicht, dass viele Menschen die Existenz von awk und Fenstern im selben Universum assoziieren .....: P
FoldedChromatin
2
Verwenden Sie awk weiterhin für Textverarbeitungsjobs. Ich werde oft ein Skript in etwas anderem (Ruby, Python) starten und am Ende wegen der Einfachheit und Kraft zu awk zurückkehren.
Rumbleweed
103

Wenn Sie schnell die Grundlagen von awk lernen, können Sie in der Tat erstaunliche Dinge über die Befehlszeile tun.

Der wahre Grund, awk zu lernen, besteht darin, eine Ausrede zu haben, um das großartige Buch The AWK Programming Language der Autoren Aho, Kernighan und Weinberger zu lesen . Sie würden aus dem Namen denken, dass es Sie einfach lehrt, awk. Eigentlich ist das nur der Anfang. Der Einstieg in die Vielzahl von Problemen, die gelöst werden können, wenn eine übersichtliche Skriptsprache verwendet wird, die die Manipulation von Zeichenfolgen vereinfacht - und awk war eine der ersten -, führt den Leser in die Implementierung einer Datenbank, eines Parsers und eines Interpreters ein und (wenn mir der Speicher dient) ein Compiler für eine kleine projektspezifische Computersprache! Wenn sie nur ein Beispielbetriebssystem mit awk programmiert hätten, wäre das Buch eine ziemlich vollständige Einführung in die Informatik gewesen!

Bekanntlich klar und prägnant, wie das Originalbuch in C-Sprache, ist es auch ein wunderbares Beispiel für freundliches technisches Schreiben, das richtig gemacht wurde. Auch der Index ist ein Stück Handwerkskunst.

Awk? Wenn Sie es wissen, werden Sie es gelegentlich über die Befehlszeile verwenden, aber für alles, was größer ist, fühlen Sie sich gefangen und können nicht auf die umfassenderen Funktionen Ihres Systems und des Internets zugreifen, auf die so etwas wie Python Zugriff bietet. Aber das Buch? Sie werden immer froh sein, dass Sie es gelesen haben!

Brandon Rhodes
quelle
5
+1 Verkauft. Ich werde dieses Buch bestellen. Ich habe awk jahrelang als schnelle und leistungsstarke einzeilige Skriptsprache verwendet. Awk ist ein großartiger Vorprozessor für Dateien, für deren Code sonst ein Dutzend Zeilen benötigt würden. Ich kann nicht zählen, wie oft ich das Formular verwendet habe: awk '{print $ 1, $ 2}'
galaxywatcher
2
Einverstanden. Es widerspricht fast dem Glauben, wie kompakt dieses Buch alles ist, was es enthält. Es umfasst mehr als die meisten zeitgenössischen Bücher in 1/10 (?) Der Länge.
Ton
3
Ich lese gerade dieses Buch und es hat meine Begeisterung für awk fast besessen gemacht.
Galaxywatcher
3
Siehe auch die ausgezeichnete Gawk: Effektive AWK-Programmierung .
lhf
1
Ich habe gerade das erste Kapitel gelesen. Es ist unglaublich. Mistery beschloss.
Vaichidrewar
29

Der einzige Grund, den ich benutze, awkist die automatische Aufteilung:

awk '{print $3}' < file.in

Dies druckt das dritte durch Leerzeichen getrennte Feld in file.in. Es ist ein bisschen einfacher als:

tr -s ' ' < file.in | cut -d' ' -f3
Greg Hewgill
quelle
3
warum verwenden awk '{print $3}' < file.instatt awk '{print $3}' file.in? Liest awk nicht bereits Dateien, wenn sie als Argumente übergeben werden?
Mbigras
@mbigras Sicher, Sie können awk so oder so verwenden.
Greg Hewgill
Selbst bei doppelter Größe mag ich die Non-Awk-Lösung. Und ich weiß nicht, warum ich hasse awk: /
MD. Mohiuddin Ahmed
25

Ich denke, awk ist großartig, wenn Ihre Datei Spalten / Felder enthält . Ich benutze es, wenn ich eine bestimmte Spalte in einer mehrspaltigen Datei verarbeite / analysiere. Oder wenn ich eine bestimmte Spalte hinzufügen / löschen möchte.

z.B

awk -F \t '{ if ($2 > $3) print; }' <filename>

wird nur gedruckt, wenn der Wert der 2. Spalte in einer durch Tabulatoren getrennten Datei größer als der Wert der 3. Spalte ist.

Natürlich könnte ich Perl oder Python verwenden, aber awk macht es mit einem kurzen einzeiligen Befehl so viel einfacher.

Auch awk zu lernen ist ziemlich kostengünstig. Sie können awk-Grundlagen in weniger als einer Stunde erlernen, es ist also nicht so aufwändig wie das Erlernen einer anderen Programmier- / Skriptsprache.

Nikhil
quelle
Obwohl ich awk nicht wirklich oft benutze, ist dies eine großartige Verwendung für awk.
Paul Nathan
8

Ich benutze AWK gelegentlich für den Umgang mit HTML. Dieser Code übersetzt beispielsweise Tabellen in CSV-Dateien:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Was großartig ist, wenn Sie Bildschirmkratzen. Eigentlich könnte es sein, dass ich AWK liebe, weil ich so schnell die falsche Lösung für Probleme finden kann :) Weitere Beispiele . Es wird auch in Jon Bentleys schönen Programmierperlen erwähnt .

Dave
quelle
7

Ich benutze ab und zu awk. Es ist gut für sehr einfaches Mischen von Text mitten in einer Pipeline. Es füllt eine sehr enge Nische zwischen der Notwendigkeit, es überhaupt nicht zu benötigen und der Notwendigkeit, Perl / Python / was auch immer auszupeitschen.

Ich würde Ihnen nicht raten, viel Zeit damit zu verbringen, aber es könnte nützlich sein, die Grundlagen der Syntax zu kennen - zumindest so weit, dass Sie das Handbuch schnell konsultieren können, falls Sie es jemals verwenden möchten.

Eevee
quelle
6

6 Jahre nachdem ich diese Frage gestellt habe, kann ich jetzt mit Sicherheit antworten: Nein, awk zu lernen ist es nicht wert.

Grundlegende Aufgaben sind einfache Bash-Befehle oder sogar einfache GUI-Tools. Komplexere Aufgaben können mit modernen dynamischen Sprachen wie Python (fav oder mine) oder Ruby problemlos gelöst werden.

Sie sollten auf jeden Fall eine moderne dynamische Skriptsprache lernen, da diese Ihnen bei so vielen Aufgaben (Web, Admin, Datenverarbeitung, Automatisierung usw.) hilft. Und wenn Sie so ein Werkzeug wie awk lernen, ist das völlig nutzlos. Sie sparen jedenfalls bestenfalls ein paar Sekunden pro Monat.

e-satis
quelle
2
Nicht unbedingt wahr. Wenn Sie wirklich große Dateien analysieren, ist dies möglicherweise viel schneller als bei anderen Tools.
user1071847
Interessant, weil Sie einige Jahre später immer noch Fragen zu awk stellen. Ich war einer der ursprünglichen Antwortenden und benutze es bis heute mit einiger Regelmäßigkeit
Dexygen
5

Die meisten awk one-Liner können mit Perl one-Liner erzielt werden - wenn Sie sich für eine Perl one liner-Denkweise entscheiden. Oder verwenden Sie einfach Perl drei Liner :)

Wenn Sie Shell-Skripte pflegen, die von jemandem geschrieben wurden, der awk mochte, müssen Sie awk lernen.

Selbst wenn es keinen praktischen Bedarf gibt, wird es nicht lange dauern, bis Sie die Grundlagen erlernt haben, wenn Sie Regex bereits kennen, und es macht Spaß zu sehen, wie die Dinge damals entworfen wurden. Es ist ziemlich elegant.

schlank
quelle
4

Wenn Sie sed bereits kennen und verwenden, können Sie auch mindestens ein bisschen awk aufnehmen. Sie können für einige ziemlich mächtige Tricks zusammengefügt werden. Beeindruckt immer das Publikum.

Internet-Freund
quelle
4

Computerworld hat kürzlich ein Interview mit Alfred V. Aho (einem der drei Schöpfer von AWK) über AWK geführt. Es ist eine ziemlich interessante Lektüre. Vielleicht finden Sie darin einige Hinweise, warum es eine gute Idee ist, AWK zu lernen.

dlat
quelle
Schön, hat mich aber nicht überzeugt. AWK ist ein sehr gutes Tool, aber ich denke, ich werde es nie genug brauchen, um mir die Zeit zu nehmen, es zu lernen, anstatt meine Lösung in sed oder python zu hacken.
E-Satis
4

Das Erlernen von AWK war für mich in meinem letzten Vertrag von unschätzbarem Wert, als ich an einem eingebetteten Linux-System arbeitete, auf dem weder Perl noch die meisten anderen Skriptsprachen installiert waren.

Sauerstoff
quelle
2
9 Jahre später und ich habe awk heute viel benutzt, während ich Git Logs
gepackt habe
3

awk hat ein sehr gutes Verhältnis von Dienstprogramm / Schwierigkeitsgrad und "simple awk" funktioniert unter jedem Unix / Linux / MacOS (und kann auch auf anderen Systemen installiert werden).

Es wurde im Goldenen Zeitalter entwickelt, als die Leute das Tippen hassten, so dass Skripte sehr, sehr kurz und schnell zu schreiben sind. Ich werde versuchen, mawk zu installieren, eine schnelle Version, die angeblich die Berechnung ungefähr 9-mal beschleunigt. Awk / gawk ist ziemlich langsam. Wenn Sie sie also anstelle von R usw. verwenden möchten, möchten Sie möglicherweise mawk.

BongBong Chu
quelle
2

Dies ist vor allem dann nützlich, wenn Sie gelegentlich Protokolldateien für Daten oder die Ausgabe von Programmen während der Shell-Skripterstellung analysieren müssen, da es in awk sehr einfach ist, zu erreichen, dass Sie dadurch etwas mehr Codezeilen in Python benötigen.

Es hat sicherlich mehr Kraft als das, aber dies scheinen Aufgaben zu sein, für die die meisten Leute es benutzen.

NeuroSys
quelle
2

Natürlich: Ich arbeite in einer Umgebung, in der die einzigen verfügbaren Sprachen sind: (eine Shity-Sprache, die COBOL, OMG, OMG generiert), Bash (alte Version), Perl (ich beherrsche es noch nicht), Sed, Awk und einige andere Befehlszeilenprogramme. Das Wissen awkersparte mir mehrere Stunden (und hatte mehrere Textverarbeitungsaufgaben von meinen Kollegen generiert - sie kommen mindestens dreimal am Tag zu mir).

Zsolt Botykai
quelle
1

Ich würde sagen, es lohnt sich wahrscheinlich nicht mehr. Ich benutze es von Zeit zu Zeit als viel vielseitigeren Stream-Editor als sed mit Suchfähigkeiten, aber wenn Sie mit Python vertraut sind, kenne ich keine Aufgabe, die Sie so viel schneller erledigen können, um die benötigte Zeit zu kompensieren awk lernen.

Der folgende Befehl ist wahrscheinlich der einzige, für den ich in den letzten zwei Jahren awk verwendet habe (er löscht halb entfernte Pakete von meinen Debian / Ubuntu-Systemen):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
Matthias Kestenholz
quelle
1

Nee.

Auch wenn es interessant sein mag, können Sie alles, was awk kann, mit anderen, leistungsstärkeren Tools wie Perl tun.

Verbringen Sie Ihre Zeit damit, diese leistungsstärkeren Werkzeuge zu erlernen - und nehmen Sie dabei nur gelegentlich etwas Awk mit.

Ed Guiness
quelle
1

Ich würde sagen, dass es gibt. Für einfache Dinge ist AWK für den unerfahrenen Systemadministrator / Entwickler viel einfacher als Python. Sie können ein wenig AWK lernen und viele Dinge tun. Python zu lernen bedeutet, eine ganz neue Sprache zu lernen (ja, ich weiß, AWK ist eine Sprache, die auch Sinn macht).

Perl ist vielleicht in der Lage, viele Dinge zu tun, die AWK tun kann, bot aber heutzutage die Wahl, Python hier zu wählen. Also ja, du solltest AWK lernen. aber lerne auch Python :-)

wzzrd
quelle
1

awkist eine Powertool-Sprache, daher werden Sie wahrscheinlich awkirgendwo verwendet, wenn Sie ein IT- Experte jeglicher Art sind. Wenn Sie mit der Syntax und den regulären Ausdrücken von grepund umgehen können sed, sollten Sie keine Probleme beim Aufnehmen habenawk und es lohnt sich wahrscheinlich, dies zu tun.

Wo ich awkwirklich Glanz gefunden habe, liegt in der Vereinfachung von Dingen wie der Verarbeitung mehrzeiliger Datensätze und dem gleichzeitigen Zerlegen / Interpolieren mehrerer Dateien.


quelle
0

Jetzt, da PERL auf so ziemlich jede wichtige Plattform portiert ist, würde ich sagen, dass es sich nicht lohnt. Es ist vielseitiger als sed und awk zusammen. Die automatische Aufteilung kann in Perl wie folgt durchgeführt werden:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

BEARBEITEN: Vielleicht möchten Sie sich noch etwas mit awk vertraut machen, da einige andere Tools auf der Philosophie musterbasierter Aktionen basieren (z. B. DTrace unter Solaris).

zvrba
quelle
0

Ich arbeite in einem Bereich, in dem die Dateien im Spaltenformat vorliegen. Daher ist awk für mich von unschätzbarem Wert, um die Datei neu zu formatieren, damit verschiedene Software zusammenarbeiten können. Für Nicht-IT-Berufe ist die Verwendung von awk ausreichend und perfekt. Heute ist die Computergeschwindigkeit kein Problem mehr, daher kann ich awk & unix kombinieren, um viele 1-Liner-Befehle in ein "Skript" zu leiten. Bei der Awk-Suche nach Feld und Datensatz überprüfe ich die Dateidaten sehr schnell, anstatt "vi", um eine Datei zu öffnen. Ich muss sagen, dass awk-Fähigkeiten meiner Arbeit besonders Freude bereiteten. Ich kann Kollegen dabei unterstützen, Dinge mit awk schnell zu klären. Erstaunlicher Code für mich.

Hai Truong
quelle
0

Ich habe kürzlich versucht, Netzwerk-PCAP-Dateien zu visualisieren, die einen DOS-Angriff protokollieren, der sich auf über 20 GBit / s beläuft. Ich brauchte den Zeitstempel und die IP-Adressen. In meinem Szenario hat der AWK -Einzeiler auch fabelhaft und ziemlich schnell gearbeitet. Ich habe AWK speziell verwendet, um die extrahierten Dateien zu bereinigen, die IP-Adressen und die Gesamtpaketanzahl von diesen IP-Adressen innerhalb einer gruppierten Zeitspanne abzurufen. Ich stimme voll und ganz dem zu, was andere Leute oben geschrieben haben. Es hängt von Ihren Bedürfnissen ab.

Ash Catchem
quelle
0

Ein Grund, awk NICHT zu lernen, ist, dass es keine nicht gierigen Übereinstimmungen in regulären Ausdrücken gibt.

Ich habe einen awk-Code, den ich jetzt nur noch umschreiben muss, weil ich plötzlich debuggt habe, dass es in awk / gawk keine nicht gierigen Übereinstimmungen gibt, so dass einige reguläre Ausdrücke nicht richtig ausgeführt werden können.

user619271
quelle
0

Es hängt von Ihren Teamkollegen und Ihrem Leiter und der Aufgabe ab, an der Sie arbeiten.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
Kenneth
quelle
0

Ich habe zurzeit einige Codierungen in Python durchgeführt. Aber ich weiß es immer noch nicht gut genug, um es einfach für einfache einmalige Dateiumwandlungen zu verwenden.

Mit awk kann ich schnell einen einzeiligen Code in der Unix-Befehlszeile entwickeln, der einige ziemlich schnelle Transformationen ausführt. Jedes Mal, wenn ich awk verwende, ist der Code, den ich schreibe, verfügbar und nicht länger als ein paar Zeilen. Vielleicht eine "if" -Anweisung und eine "printf" -Anweisung hier oder da in der einen Zeile.

Ich habe mit awk noch nie einen Code geschrieben, der länger als 10 Zeilen ist. Ich habe einige solcher Skripte vor Jahren gesehen.

Aber alles, was viele Codezeilen erforderte, würde ich auf Python zurückgreifen.

Ich liebe awk. Es ist ein sehr leistungsfähiges Werkzeug in Kombination mit sed.

user5901715
quelle