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:
- die Nummer der Zeile NR
- die Anzahl der Felder auf dieser Zeile NF
- den Inhalt der Originalzeile $0
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-