EMZETT.
Login

Kurz: 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 }.

Teil des Kurses AWK

Kapitel 1 von 8 im Kurs AWK. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 Pipe

Das 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:

VariableBedeutung
$0ganze Zeile
$1, $2, …einzelne Felder
NFAnzahl Felder der Zeile
NRlaufende Zeilennummer
FSFeldtrenner (Eingabe)
OFSFeldtrenner (Ausgabe)
RS, ORSZeilentrenner
FILENAMEaktuelle 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

Merke

  • AWK-Programme bestehen aus muster { aktion }; BEGIN und END laufen davor/danach
  • Jede Zeile wird in Felder $1, $2, … zerlegt, NF und NR zählen
  • print und printf geben aus, Variablen brauchen keine Deklaration
  • Zahlen und Strings werden automatisch ineinander umgewandelt

Übungsaufgabe

Gib mit BEGIN die Quadratzahlen von 1 bis 10 aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Weiter: Variablen, Ausdrücke und Kontrollfluss

Alle Kapitel: AWK im Überblick