Mit AWK arbeiten

Oktober 2023

Einstieg

Das Kommando awk (siehe awk in Wikipedia) ist ein Tool zum automatisierten Bearbeiten von Text mithilfe einer eigenen Programmiersprache.
Entwickelt Anfang der 1970er Jahre durchlief awk verschiedene Weiterentwicklungen und Version, unter Linux gawk.
Das Buch The AWK Programming Language (Autoren Alfed V. Aho, Brian W. Kernighan und Peter J. Weinberger, erschienen 1988, ISBN 0-201-07981-X) ist auch online als PDF zu finden und beschreibt einen Stand, der ausreicht, wenn man awk-Programme produktiv einsetzen möchte. Der Anhang A dieses Buchs, AWK Summary, ist eine prima Quick-Referenz.

Aufruf von awk

awk [-FZeichen] 'Programm' [Datei ...]       # Programm in einer Zeichenkette
awk [-FZeichen] -f Programmdatei [Datei ...] # Programm in einer Datei
  • awk arbeitet einen Text zeilenweise nacheinander ab
  • Das Programm wird für jede Zeile wirksam
  • Ein Programm in einer Zeichenkette oder eine Programmdatei muss angegeben sein,
  • sonst arbeitet awk nicht.
  • Die Eingabezeilen werden aus einer Datei (oder mehreren) geholt oder, wenn nicht angegeben, von der Standardeingabe erwartet
  • Ergebnisdaten werden zur Standardausgabe gesandt.

Geschweifte Klammern, die Option -F und Felder

otto@DESKTOP:~
$ date | awk '{ print }'
Sun Jul 26 14:36:59 CEST 2020
Ein Programm, das nur aus dem Befehl print besteht, ist wohl die kleinste awk-Anwendung. Jede Zeile wird einfach nur ausgegeben.
Eine Befehlszeile hat die Syntax
[Muster] { Kommando(s) }
Kommandos können ohne Muster angegeben werden, aber die geschweiften Klammern müssen sein.
Jede Eingangszeile teilt awk in Felder ein, die den Name $1, $2, $3 usw. zugeordnet werden. Voreingestellt gelten Leerzeichen als Trennungszeichen.
  • $0 gibt es auch, das wäre die ganze Zeile.
  • $NF ist immer das letzte Feld
  • NF Anzahl Felder
otto@DESKTOP:~
$ date | awk '{ print $0 }'
Sun Jul 26 15:24:16 CEST 2020
otto@DESKTOP:~
$ date | awk '{ print $4 }'
15:24:29
Ein anderes Trennzeichen lässt sich über die Option -F einstellen. Im Beispiel ist es der Doppelpunkt.
otto@DESKTOP:~
$ date | awk -F: '{ print $1 }'
Sun Jul 26 15

Mehrere Kommandos, Array und Zeichenketten verbinden

Werden mehrere Kommandos benötigt, verfasst man besser eine Programmdatei. Im folgenden Beispiel werden nur zwei Kommandos benötigt, da kann man sich mit einem Semikolon (;) als Trennzeichen behelfen.
otto@DESKTOP:~
$ date | awk  '{ split($4,Uhrzeit,":"); print "Es ist " Uhrzeit[1] " Uhr " Uhrzeit[2] }'
Es ist 15 Uhr 59
Das Builtin-Funktion split() im Beispiel zerlegt das Feld 4 der eingelesenen Zeile in Elemente des Arrays Uhrzeit (Name frei gewählt). Das angebene Trennzeichen ist der Doppelpunkt, und so landen Stundenzahl, Minuten- und Sekundenzahl in dieser Reihenfolge im Array.
Das print-Kommando gibt Elemente des Arrays und konstante Zeichenketten aus, die in Double Quotes gesetzt sind. Leerzeichen zwischen den Teilzeichenketten wirken als Verbindungsoperator.