EMZETT.
Login

Kurz: Eine typische Aufgabe: Statuscodes zählen, Pfade ranken, Bytes summieren.

Teil des Kurses AWK

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

Logdatei auswerten

Eine typische Aufgabe: Statuscodes zählen, Pfade ranken, Bytes summieren.

cat > /tmp/awk-access.log <<'LOG'
10.0.0.1 - - [15/Mar/2024:10:00:01] "GET /index.html HTTP/1.1" 200 5120
10.0.0.2 - - [15/Mar/2024:10:00:05] "GET /bild.png HTTP/1.1" 200 20480
10.0.0.1 - - [15/Mar/2024:10:01:10] "GET /fehlt HTTP/1.1" 404 512
10.0.0.3 - - [15/Mar/2024:10:02:00] "POST /login HTTP/1.1" 302 0
10.0.0.2 - - [15/Mar/2024:10:03:30] "GET /index.html HTTP/1.1" 200 5120
LOG
awk '
{
    status[$9]++
    bytes += $10
    pfad[$7]++
    ip[$1]++
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    print "Statuscodes:"
    for (s in status) printf "  %s: %d\n", s, status[s]
    PROCINFO["sorted_in"] = "@val_num_desc"
    print "Meistbesucht:"
    for (p in pfad) { printf "  %s (%d)\n", p, pfad[p]; if (++n >= 2) break }
    printf "Übertragen: %.1f KB in %d Anfragen\n", bytes / 1024, NR
    printf "Verschiedene IPs: %d\n", length(ip)
}' /tmp/awk-access.log
rm /tmp/awk-access.log

Ausgabe:

Statuscodes:
  0: 1
  20480: 1
  512: 1
  5120: 2
Meistbesucht:
  HTTP/1.1" (5)
Übertragen: 0.0 KB in 5 Anfragen
Verschiedene IPs: 3

CSV-Bericht

cat > /tmp/awk-verkauf.csv <<'CSV'
region,produkt,menge,preis
Nord,Apfel,10,1.20
Sued,Birne,5,0.80
Nord,Birne,8,0.80
West,Apfel,20,1.10
Sued,Apfel,7,1.20
CSV
awk -F, '
NR == 1 { next }
{
    umsatz = $3 * $4
    pro_region[$1] += umsatz
    pro_produkt[$2] += $3
    gesamt += umsatz
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    print "Umsatz je Region:"
    for (r in pro_region) printf "  %-5s %7.2f  (%4.1f%%)\n", r, pro_region[r], 100 * pro_region[r] / gesamt
    print "Menge je Produkt:"
    for (p in pro_produkt) printf "  %-6s %3d\n", p, pro_produkt[p]
    printf "Gesamt: %.2f\n", gesamt
}' /tmp/awk-verkauf.csv
rm /tmp/awk-verkauf.csv

Ausgabe:

Umsatz je Region:
  Nord    18.40  (34.8%)
  Sued    12.40  (23.5%)
  West    22.00  (41.7%)
Menge je Produkt:
  Apfel   37
  Birne   13
Gesamt: 52.80

Wörter zählen

printf 'Der Hund und die Katze. Die Katze und der Hund!\nDer Hund schläft.\n' | awk '
{
    zeile = tolower($0)
    gsub(/[^a-zäöüß ]/, "", zeile)
    n = split(zeile, w, " ")
    for (i = 1; i <= n; i++) if (w[i] != "") zaehler[w[i]]++
}
END {
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (wort in zaehler) {
        printf "%-6s %d\n", wort, zaehler[wort]
        if (++k == 2) break
    }
}'

Ausgabe:

hund   3
der    3

Textbericht mit Kopfzeile und Zeilenumbruch

printf 'Mia 17 Berlin\nTom 25 Hamburg\nZoe 31 Köln\n' | awk '
BEGIN {
    printf "%-6s %4s  %-8s\n", "Name", "Alter", "Stadt"
    print "-----------------------"
}
{ printf "%-6s %4d  %-8s\n", $1, $2, $3; summe += $2 }
END {
    print "-----------------------"
    printf "%-6s %4.1f\n", "Mittel", summe / NR
}'

Ausgabe:

Name   Alter  Stadt
-----------------------
Mia      17  Berlin
Tom      25  Hamburg
Zoe      31  Köln
-----------------------
Mittel 24.3

Merke

  • AWK ist ideal für Log-Auswertungen: zählen, gruppieren, summieren
  • CSV-Berichte entstehen aus -F,, Arrays und printf
  • PROCINFO["sorted_in"] macht Berichte deterministisch
  • Mit here-documents (<<'LOG') lassen sich Beispieldaten direkt im Skript mitgeben

Übungsaufgabe

Berechne aus einer CSV den Durchschnittspreis pro Produkt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Reguläre Ausdrücke vertieft

Weiter: Referenz und Spickzettel

Alle Kapitel: AWK im Überblick