[Index]

2 Die Anwendung von awk

Aus einer Shell kann man awk auf zwei Arten aufrufen: entweder durch die Übergabe aller Optionen und Kommandos auf der Befehlszeile oder unter Angabe einer awk-Programmdatei. Die Daten, die mit awk verarbeitet werden sollen, können entweder in einer ASCII-Datei gespeichert sein oder durch eine Pipe auf awk umgeleitet werden.

awk '{command1; command2; ...}' inputfile  >  outputfile
awk -f Programmdatei            inputfile  >  outputfile

program [options][input] | awk '{command1; command2; ...}'  > outputfile
Die ersten awk-Beispiele werden wir mit der Ausgabe des bekannten Unix-Befehls cal testen. Dieser Befehl stellt uns einen bestimmten Monat eines Kalenderjahrs dar. Für die ersten Schritte mit awk wird also noch keine Quelldatei benötigt. Die Ausgabe des Befehls cal ist zwar tabellarisch geordnet, hat aber trotzdem nicht immer die gleiche Form. Damit ist sie sehr gut zum Lernen von awk geeignet :-)
cal -m 4 2001

     April 2001
Mo Di Mi Do Fr Sa So
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Der Befehl cal schreibt für einen Monat immer acht Zeilen: zuerst die Überschrift, dann den Tabellenkopf und danach wochenweise die Liste der Tage. Auch wenn sich die Tage eines Monats auf fünf Wochen verteilen lassen, werden insgesamt acht Zeilen ausgegeben. Die letzte Zeile ist in diesem Fall leer. Unser erster awk-Aufruf wird nun die Ausgabe von cal nutzen und uns einige Informationen darüber geben:
cal -m 4 2001 | gawk '{print NR "  " NF "   "  $0}'

1  2        April 2001
2  7   Mo Di Mi Do Fr Sa So
3  1                      1
4  7    2  3  4  5  6  7  8
5  7    9 10 11 12 13 14 15
6  7   16 17 18 19 20 21 22
7  7   23 24 25 26 27 28 29
8  1   30
Die Ausgabe des Befehls cal wurde an awk weitergeleitet und mit einem ganz einfachen einzeiligen Programm ausgewertet. Für jede Zeile des Kalenders hat awk folgende Informationen ausgegeben: Dazwischen wurden zur besseren Lesbarkeit noch einige Leerzeichen angeordnet.
Weiterhin kann awk die einzelnen Datenfelder der Eingabe in die Variablen $1 ... $NF speichern. Das Feldtrennzeichen FS ist standardmäßig ein white space (Leerzeichen oder Tab). Es kann aber z.B. vom User auch ein Komma oder Semikolon als FS festgelegt werden.
Eine Eingabezeile kann man mit awk als Ganzes auswerten (wie im oberen Beispiel). Man kann aber auch auf die einzelnen Felder zugreifen. Wichtige eingebaute Variablen von awk finden Sie in der folgenden Tabelle zusammengefasst:

Variable Erklärung Verhalten
$NR die aktuell verarbeitete Zeile und am Ende die Anzahl der Zeilen
(number of records).
variabel
$NF Anzahl der Felder in der aktuell verarbeiteten Zeile
(number of fields).
variabel
$0 die gesamte aktuelle Eingabezeile variabel
$i das Datenfeld i in der aktuellen Eingabezeile variabel
FILENAME der Name der Eingabedatei oder - für "Standardeingabe". konstant
RS das Trennzeichen der Eingabezeilen, Standard = line feed
(record separator)
konstant ab BEGIN
ORS das Trennzeichen der Ausgabezeilen, Standard = line feed
(output record separator)
konstant ab BEGIN
FS das Trennzeichen der Felder der Eingabe, Standard = white space
(field separator)
konstant ab BEGIN
OFS das Trennzeichen der Felder der Ausgabe, Standard = white space
(output field separator)
konstant ab BEGIN


April 2001 -Stefan Lagotzki-