Kurz: Eine typische Aufgabe: Statuscodes zählen, Pfade ranken, Bytes summieren.
Teil des Kurses AWK
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.logAusgabe:
Statuscodes:
0: 1
20480: 1
512: 1
5120: 2
Meistbesucht:
HTTP/1.1" (5)
Übertragen: 0.0 KB in 5 Anfragen
Verschiedene IPs: 3CSV-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.csvAusgabe:
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.80Wö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 3Textbericht 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.3Merke
- AWK ist ideal für Log-Auswertungen: zählen, gruppieren, summieren
- CSV-Berichte entstehen aus
-F,, Arrays undprintf 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
Wofür dient NR == 1 { next }?
- Die Kopfzeile überspringen (richtig)
- Die erste Zeile löschen
- Das Programm beenden
- Alles ausgeben
Wie summiert man pro Schlüssel?
- summe[schluessel] += wert (richtig)
- sum(schluessel)
- group by
- arr.add
Was liefert length(array)?
- Die Anzahl der Einträge (richtig)
- Die Bytegröße
- Den ersten Schlüssel
- Nichts
Weiter im Kurs
Zurück: Reguläre Ausdrücke vertieft
Weiter: Referenz und Spickzettel
Alle Kapitel: AWK im Überblick