Kapitel 13 awk-Programmierung
Zwar haben Sie mit der Shell-Programmierung einen Trumpf in der Hand, mit dem Sie wohl fast alle Probleme lösen können. Trotzdem kommt man manchmal an einen Punkt, an dem sich die Lösung als nicht mehr so einfach und relativ umständlich erweist. Hier empfiehlt es sich häufig, auf andere Werkzeuge umzusteigen oder – sofern die Kenntnisse vorhanden sind – sich ein solches Werkzeug (bspw. in C) selbst zu programmieren. Allerdings hat man oft nicht die Zeit und Lust, gleich wieder etwas Neues zu erfinden. Wenn Sie also mit der Shell am Limit sind, ist ein Umstieg auf andere »Werkzeuge« wie awk oder auch Perl sinnvoll.
13.1 Einführung und Grundlagen von awk
Ich will es gar nicht leugnen, mit Perl hätten Sie die ultimativste Waffe für eigentlich (fast) alle Probleme, aber auch hier ist die Einarbeitungsphase und erforderliche Lernzeit relativ lange, wenn man von null anfangen muss (auch wenn bei Perl die Lernkurve recht steil ist). Mit awk hingegen haben Sie einen »kleineren«, aber schnell erlernbaren Interpreter. Ich fasse mich kurz, für eine Einführung in awk genügen 50 Seiten, für eine solche in Perl wäre dieser Umfang ein Witz.
Die Hauptaufgaben von awk glichen zu Beginn der Entwicklung denen von sed. awk wurde als ein Programm entwickelt, das als Reportgenerator dienen sollte. Allerdings hatte sich awk binnen kurzer Zeit zu einer echten Programmiersprache entwickelt. Die Syntax von awk gleicht der von C, ja man kann fast meinen, einen C-Interpreter vor sich zu haben. Allerdings hat awk gegenüber C den Vorteil, dass Sie sich nicht mit all den ungemütlichen Features von C befassen müssen.
Somit wurde awk im Anfangsstadium als Programm eingesetzt, mit dem Dateien zeilenweise eingelesen und in einzelne Felder (bzw. Wörter) zerlegt wurden. Daraus entstand dann eine benutzerdefinierte Ausgabe – im Prinzip also wie bei sed. Allerdings wurde awk in kurzer Zeit enorm erweitert. Heute bietet awk alle Konstrukte an, die von (fast) jeder modernen Programmiersprache verwendet werden: angefangen von einfachen Variablen, Arrays, den verschiedenen Kontrollstrukturen bis hin zu Funktionen (auch den benutzerdefinierten).
13.1.1 History und Versionen von awk
Der Name awk stammt von den Anfangsbuchstaben der Entwickler (aus dem Jahre 1977) Aho, Weinberger und Kerninghan. Allerdings existieren mittlerweile drei Hauptzweige von awk-Versionen. Das Ur-awk (auch unter dem Namen oawk (für old awk) bekannt) von den eben besagten Entwicklern, das erweiterte nawk (new awk) von 1985 und die GNU-Version gawk (GNU awk), das wiederum eine Erweiterung von nawk darstellt. Linux, FreeBSD und NetBSD benutzen hierbei standardmäßig gawk und die meisten UNIX-Varianten (Solaris, HP-UX etc.) in der Regel nawk, wobei auch hier GNU-awk nachinstalliert werden kann. Das Ur-awk wird eigentlich nicht mehr genutzt und es gibt auch keinen Grund mehr, es zu verwenden, da hier die Unterschiede zu nawk und gawk erheblich sind. Dies fängt damit an, dass beim Ur-awk einige Schlüsselwörter (delete, do, function, return), vordefinierte Funktionen, spezielle Variablen und noch einiges mehr fehlen. Sofern Sie irgendwo einen Uralt-Rechner verwalten müssen, sei trotzdem in einer Liste aufgeführt, was das Ur-awk nicht kann oder kennt:
|
Die Schlüsselwörter delete, do, function und return. |
|
Die vordefinierten Funktionen atan2, close, cos, gsub, match, rand, sin, srand, sub, system, tolower und toupper. |
|
Die speziellen Variablen ARGC, ARGV, FNR, FS, RSTART, RLENGTH und SUBSEP. Die spezielle Variable ENVIRON ist beim alten awk nicht vordefiniert. |
|
Operatoren für Ausdrücke ?, :, , und ^. |
|
Es sind nicht mehrere -f Schalter erlaubt. |
Aber eigentlich müssen Sie sich keine Gedanken darüber machen, so lange Sie nawk bzw. gawk verwenden. Allerdings erscheint es mir sinnvoll, dass Sie hier für einen gleichen Kommandoaufruf sorgen. Meistens (unter Linux) ist dies allerdings von Haus aus der Fall. Ein Aufruf von awk führt unter Linux beispielsweise dank eines symbolischen Links zu gawk.
you@host > ls -l /usr/bin/awk
lrwxrwxrwx 1 root root 8 2005–02–05 /usr/bin/awk -> /bin/awk
you@host > ls -l /bin/awk
lrwxrwxrwx 1 root root 4 2005–02–05 /bin/awk -> gawk
Unter diversen UNIX-Varianten werden Sie nicht so komfortabel weitergeleitet. Allerdings können Sie auch hier selbst einen symbolischen Link setzen:
you@host > ln -s /bin/nawk /bin/awk
Damit führt jeder Aufruf von awk nach nawk. Wenn Sie hierbei auf mehreren Systemen arbeiten, müssen Sie sich zumindest keine Gedanken um den Aufruf von awk machen, weil Sie so immer awk eingeben und dadurch entsprechende awk-Variante nutzen.
Hinweis Sie sollten aber bedenken, dass wenn Sie einen symbolischen Link auf ein anderes Programm (wie hier mit awk auf nawk) erstellen und wirklich einmal ein entsprechendes Paket nachinstallieren sollten, wäre die Folge, dass das Originalprogramm (hier bspw. nawk) überschrieben würde. Schlimmer noch, dass System registriert beide Pakete als installiert und wäre somit inkonsistent.
Hinweis Im weiteren Verlauf des Buches werde ich immer awk nutzen bzw. den Aufruf oder die Syntaxbeschreibung awk verwenden. Dabei ist immer von nawk oder gawk die Rede (abhängig vom System), aber niemals vom alten Ur-awk (oawk)!
|
13.1.2 Die Funktionsweise von awk
awk wartet auf Daten vom Eingabestrom, welche von der Standardeingabe oder von Dateien kommen können. Gewöhnlich werden hierbei die Dateien, die in der Kommandozeile angegeben wurden, eine nach der anderen geöffnet. Anschließend arbeitet awk Zeile für Zeile bis zum Dateiende ab oder – falls die Daten von der Standardeingabe kommen – bis (Strg)+(D) (EOF) gedrückt wurde. Bei der Abarbeitung werden die einzelnen Zeilen in einzelne Felder (bzw. Wörter) zerlegt. Als Trennzeichen gilt hier meistens auch dasjenige, was in der Variablen IFS (wobei diese Variable in awk FS lautet) steht, ein Leerzeichen oder/und ein Tabulatorzeichen.
Anschließend wird für gewöhnlich jede Zeile mit einem Muster bzw. regulären Ausdruck verglichen und bei gefundenen Übereinstimmungen eine bestimmte Aktion ausgeführt – eben ähnlich wie bei sed, nur dass die Aktionen hier wesentlich komplexer sein können/dürfen.
Hinweis Natürlich führt awk auch eine Syntaxanalyse durch, ob die Kommandos sprachlich korrekt verwendet wurden, und gibt bei einem Fehler eine entsprechende Meldung aus.
|
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|