Was ist eigentlich awk und wofür ist es gut?
Ich versuche mal eine kurze Antwort zu geben: awk ist eine UN*X Skriptsprache. In der Regel gehört sie zum UN*X Betriebssystem dazu wie ls, cp, grep etc. awk wurde zur Verarbeitung von Textdateien in pipes gemacht. Aber es gibt auch andere Möglichkeiten awk einzusetzen, aber das gehört zur langen und ausführlichen Antwort.
Woher kommt der Name?
Dazu gibt es zwei verschiedene Antworten. Die erste sagt, das die drei Programmautoren Alfred Aho, Peter Weinberger und Brian Kernighan die Anfangsbuchstaben ihrer Nachnamen genommen haben und ... fertig war der Name des Programms.
Klingt sinnvoll und irgendwie überzeugend. Ich habe aber auch mal irgendwo (es ist schon Jahre her) folgende Erklärung gelesen. awk ist die erste Silbe des englischen Wortes awkward, was mein Lexikon mit "ungeschickt, umständlich, peinlich, mißlich, ungünstig und unpraktisch" übersetzt. Böse Zungen sehen zwischen der Bedeutung von awkward und awk einen Zusammenhang.
Das bringt uns gleich zur nächsten Frage: wie spreche ich awk richtig aus? Ich benutze beide Versionen, einmal a-w-k und einmal so, wie ich die erste Silbe von awkward ausprechen würde. Dabei wechsle ich auch gerne mal zwischen beiden Aussprachen hin und her.
Was kann man mit awk machen?
awk kann zunächst einmal ähnliche Sachen wie grep:
# grep '^n' /etc/passwd nobody:x:65534:65534::/home/nobody:/bin/true news:x:12:11::/var/spool/news:/bin/bash
Mit awk wäre das
# awk '/^n/' /etc/passwd nobody:x:65534:65534::/home/nobody:/bin/true news:x:12:11::/var/spool/news:/bin/bash
also dasselbe. Also zwei Programme die das Gleiche machen, die sich nur in der Notation unterscheiden? Nein, das ist es nicht. Wir haben uns oben alle Benutzer deren Loginnamen mit einem "n" beginnen /etc/passwd heraus suchen lassen. Mal angenommen wir wollten nur die Anzahl der Benutzer, dann wäre das einmal
# grep '^n' /etc/passwd | wc -l
oder
# awk '/^n/ { count++; } END { print count }' /etc/passwd
Beide Kommandos machen dasselbe. Beim ersten Aufruf wird dafür eine pipe konstruiert, awk kann die Aufgabe sozusagen "alleine" lösen. Na ja, das ist zumindest das, wofür awk gemacht wurde. Aber man kann ganz andere Sachen damit machen.
Was ist mit perl?
Die Frage musste ja kommen. Um es kurz zu machen: ich habe keine Ahnung von perl. Ich habe einmal einen Fehler in einem Skript gesucht und das war's. Der Grund dafür ist nicht, das perl schlecht ist, ich kann es einfach nicht. Als ich meine ersten Kontakte zu UN*X hatte (das war Anfang der 90er) gab's kein perl aber awk. Das habe ich mir angesehen und ich fand's gut. Das ist die ganze Geschichte. Da wo awk und Shellprogrammierung nicht reicht (und wo perl dann vielleicht Antworten und Lösungen bieten könnte) greife ich zum C-Compiler.
Ich halte perl übrigens für durchaus mächtiger als awk aber das hat auch seinen Preis:
# which -l gawk perl -rwxr-xr-x 2 root root 217760 Sep 20 13:23 /usr/bin/gawk -rwxr-xr-x 3 root root 719856 Nov 13 00:25 /usr/bin/perl
perl ist mehr als dreimal größer als gawk, die GNU Variante von awk. Für meine Probleme und ihre Lösung reichen üblicherweise die 210k, wie gesagt eventuell mit einem Shellskript.