Awk: Grundlagen: Die Grundstruktur eines awk-Skriptes
Ein awk-Skript ist folgendermaßen aufgebaut:
Bedingung1 {Aktion1} Bedingung2 {Aktion2} ... BedingungN {AktionN}
Für jeden eingelesenen Datensatz wird das Skript sukzessive abgearbeitet. Ist die Bedingung erfüllt wird für den Datensatz die Aktion ausgeführt. Ist die Bedingung nicht erfüllt wird für diesen Datensatz die Aktion nicht ausgeführt. Syntaxmäßig ist zu beachten, dass zumindest die öffnende geschweifte Aktionsklammer in der selben Zeile stehen muss wie die dazugehörende Bedingung.
Eine Aktion ist eine Sammlung von awk-Anweisungen (Zuweisungen, Schleifen, Funktionen, Verzweigungen, ...) und ist im Gegensatz zu einer Bedingung immer in geschwungene Klammern eingefasst.
Ist keine Bedingung gegeben, so wird die Aktion für alle Datensätze der Eingabe bzw. Eingebedatei(en) durchgeführt. Fehlt die Aktion, so wird jeder Datensatz auf welche die Bedingung zutrifft vollständig ausgegeben.
Ein einfaches Beispiel:
ls -la | awk '{print $0}'
Die Eingabe wird vom ls-Kommando über eine Pipeline geliefert. Das awk-Skript besteht nur aus einer Aktion. Da keine Bedingung angegeben ist wird die Aktion für jeden eingelesenen Datensatz ausgeführt. Dieses awk-Skript leitet also die Ausgabe des ls-Kommandos ungefiltert wieder auf die Standardausgabe weiter.
Hinweis
BearbeitenAwk-Interpreter sind case-sensitiv, sie unterscheiden grundsätzlich zwischen Groß- und Kleinschreibung. Das gilt für alle Bereiche, egal ob es sich um Bedingungen, um Anweisungen in Aktionen, reguläre Ausdrücke oder Zeichenketten handelt.
Das Beispiel
ls -la | awk '{print $0}'
würde so geschrieben
ls -la | awk '{PRINT $0}'
ein fehlerhaftes Ergebnis liefern. Der awk-Interpreter aus dem GNU-Projekt (gawk) zeigt in diesem Fall standardmäßig auch gar keine Fehlermeldung. Es wird im oben demonstrierten inkorrekten Fall einfach nie ein Listing ausgegeben, da awk keinen Befehl namens PRINT kennt. Diese Eigenheit birgt die Gefahr, dass Fehler im awk-Skript manchmal schwer zu orten sind und eventuell auch nicht rechtzeitig bemerkt werden. Abhilfe kann im Falle des gawk-Interpreters die Option --lint bieten:
ls -la | awk --lint '{PRINT $0}'
würde Warnhinweise in der Form
awk: Warnung: Statement möglicherweise ohne Effekt. awk: (FILENAME=- FNR=1) Warnung: Referenz auf die nicht-initialisierte Variable 'PRINT'. awk: (FILENAME=- FNR=2) Warnung: Referenz auf die nicht-initialisierte Variable 'PRINT'. ...
liefern, wodurch die fehlerhaft geschriebene Anweisung leichter einzugrenzen ist.
Siehe dazu auch: