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.