Was ist AWK?
AWK (1977, Aho, Weinberger, Kernighan – daher der Name) ist eine kleine Sprache zur zeilenweisen Textverarbeitung. Ein AWK-Programm besteht aus Mustern und Aktionen: muster { aktion }. AWK liest die Eingabe Zeile für Zeile, zerlegt jede Zeile automatisch in Felder ($1, $2, ...) und führt die Aktion aus, wenn das Muster passt.
AWK steckt auf jedem Unix-System und ist ideal für Logs, CSV, Spaltenausgaben von Befehlen und kurze Berichte. Dieser Kurs nutzt GNU AWK (gawk).
Ausführen
awk 'BEGIN { print "Hallo" }' # Programm direkt, ohne Eingabe
awk '{ print $1 }' datei.txt # erste Spalte jeder Zeile
awk -f skript.awk datei.txt # Programm aus Datei
awk -F, '{ print $2 }' daten.csv # Feldtrenner Komma
echo "a b c" | awk '{ print $2 }' # aus einer PipeDas erste Programm
BEGIN {
print "Hallo, Welt!"
print "1 + 2 =", 1 + 2
printf "%s hat %d Punkte\n", "Mia", 17
x = 10
y = x * 2
print x, y
}Ausgabe
Hallo, Welt! 1 + 2 = 3 Mia hat 17 Punkte 10 20
Der BEGIN-Block läuft vor dem Lesen der Eingabe, END danach. Ohne Eingabedatei braucht man BEGIN, sonst wartet AWK auf Eingabe.
Muster, Aktionen und Felder
In den Beispielen steht die Eingabe als Text im BEGIN-Block bereit; in der Praxis liest AWK eine Datei:
BEGIN {
zeile = "Mia 17 Berlin"
n = split(zeile, f, " ")
print n, f[1], f[2], f[3]
print length(zeile)
print toupper(f[1]), tolower(f[3])
print substr(zeile, 5, 2)
print index(zeile, "Berlin")
}Ausgabe
3 Mia 17 Berlin 13 MIA berlin 17 8
Die eingebauten Variablen, die du bei echter Eingabe nutzt:
| Variable | Bedeutung |
|---|---|
$0 | ganze Zeile |
$1, $2, ... | einzelne Felder |
NF | Anzahl Felder der Zeile |
NR | laufende Zeilennummer |
FS | Feldtrenner (Eingabe) |
OFS | Feldtrenner (Ausgabe) |
RS, ORS | Zeilentrenner |
FILENAME | aktuelle Datei |
Eingabe aus Text-Dateien verarbeiten
Ein getline-Beispiel mit einer erzeugten Datei zeigt den typischen Ablauf:
BEGIN {
datei = "/tmp/awk-demo.txt"
print "Mia 17 Berlin" > datei
print "Tom 25 Hamburg" > datei
print "Zoe 31 Köln" > datei
close(datei)
while ((getline zeile < datei) > 0) {
split(zeile, f, " ")
printf "%-5s %3d %s\n", f[1], f[2], f[3]
summe += f[2]
anzahl++
}
close(datei)
printf "Durchschnitt: %.1f\n", summe / anzahl
system("rm " datei)
}Ausgabe
Mia 17 Berlin Tom 25 Hamburg Zoe 31 Köln Durchschnitt: 24.3
So führst du den Code aus: Datei skript.awk speichern und mit awk -f skript.awk datei.txt ausführen; einfache Programme direkt als awk '{print $1}' datei.txt.
Merke
- AWK-Programme bestehen aus
muster { aktion };BEGINundENDlaufen davor/danach - Jede Zeile wird in Felder
$1,$2, ... zerlegt,NFundNRzählen printundprintfgeben aus, Variablen brauchen keine Deklaration- Zahlen und Strings werden automatisch ineinander umgewandelt
Aufgabe
Gib mit BEGIN die Quadratzahlen von 1 bis 10 aus.