Der Befehl awk verarbeitet Text zeilenweise und spaltenweise. Du definierst Muster und Aktionen, awk wendet sie auf jede Zeile an. Das macht ihn zum perfekten Werkzeug für Logdateien, CSV-Daten und tabellarische Ausgaben anderer Befehle.

Syntax

awk 'MUSTER { AKTION }' DATEI
  • MUSTER – Bestimmt, welche Zeilen verarbeitet werden.
  • AKTION – Legt fest, was mit den passenden Zeilen geschieht.
  • DATEI – Die Eingabedatei (ohne Angabe liest awk von stdin).

Wie awk Daten verarbeitet

Awk teilt jede Zeile automatisch in Felder auf. Standardmäßig trennt Whitespace (Leerzeichen, Tabs) die Felder.

Du greifst auf Felder mit $1, $2, $3 usw. zu. $0 enthält die gesamte Zeile, $NF das letzte Feld.

# Visualisierung der Feldnummern
tmpfs    788M   1.8M   786M   1%   /run/lock
|-----|  |---|  |---|  |---|  |-|  |--------|
  $1      $2     $3     $4    $5      $6

Für die folgenden Beispiele verwenden wir diese Datei teams.txt:

Bucks Milwaukee 60 22 0.732
Raptors Toronto 58 24 0.707
76ers Philadelphia 51 31 0.622
Celtics Boston 49 33 0.598
Pacers Indiana 48 34 0.585

Felder ausgeben

Gib bestimmte Spalten aus, indem du die Feldnummern angibst:

awk '{ print $1, $3 }' teams.txt

Ausgabe:

Bucks 60
Raptors 58
76ers 51
Celtics 49
Pacers 48

Das Komma zwischen $1 und $3 erzeugt ein Leerzeichen in der Ausgabe. Ohne Komma werden die Werte direkt aneinandergehängt.

Muster verwenden

Nach Text filtern

Verarbeite nur Zeilen, die ein bestimmtes Muster enthalten:

awk '/0.5/ { print $1 }' teams.txt

Ausgabe:

Celtics
Pacers

Mit regulären Ausdrucken filtern

Zeige Teams, deren Name mit einer Ziffer beginnt:

awk '/^[0-9]/ { print $1 }' teams.txt

Ausgabe:

76ers

Felder gezielt prüfen

Prüfe ein bestimmtes Feld mit dem Vergleichsoperator ~:

awk '$2 ~ /ia/ { print $1 }' teams.txt

Ausgabe (Städte mit “ia”):

76ers
Pacers

Mit !~ filterst du Zeilen, bei denen das Muster nicht zutrifft:

awk '$2 !~ /ia/ { print $1 }' teams.txt

Numerische Vergleiche

Zeige Teams mit mehr als 50 Siegen:

awk '$3 > 50 { print $1, $3 }' teams.txt

Ausgabe:

Bucks 60
Raptors 58
76ers 51

Mehrere Bedingungen kombinieren

Verwende && (UND) oder || (ODER):

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt

Ausgabe:

Bucks
Raptors

Bereichsmuster

Verarbeite alle Zeilen von einem Startmuster bis zu einem Endmuster:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt

Ausgabe:

Raptors
76ers
Celtics

BEGIN und END

Der Block BEGIN wird vor der ersten Zeile ausgeführt, END nach der letzten.

awk 'BEGIN { print "Team-Statistik" } { print $1 } END { print "---Ende---" }' teams.txt

Ausgabe:

Team-Statistik
Bucks
Raptors
76ers
Celtics
Pacers
---Ende---

Das ist praktisch, um Überschriften zu erzeugen oder Summen zu berechnen:

awk '{ sum += $3 } END { print "Siege gesamt:", sum }' teams.txt

Ausgabe:

Siege gesamt: 266

Eingebaute Variablen

VariableBedeutung
NFAnzahl der Felder in der aktuellen Zeile
NRNummer der aktuellen Zeile
FSFeldtrennzeichen (Standard: Whitespace)
OFSAusgabe-Feldtrennzeichen
FILENAMEName der aktuellen Eingabedatei

Zeilennummern ausgeben:

awk '{ print NR, $0 }' teams.txt

Ausgabe:

1 Bucks Milwaukee 60 22 0.732
2 Raptors Toronto 58 24 0.707
3 76ers Philadelphia 51 31 0.622
4 Celtics Boston 49 33 0.598
5 Pacers Indiana 48 34 0.585

Das Feldtrennzeichen andern

Standardmäßig trennt Whitespace die Felder. Mit -F oder der Variable FS änderst du das Trennzeichen.

Beispiel für /etc/passwd (Doppelpunkt als Trennzeichen):

awk -F ':' '{ print $1, $6 }' /etc/passwd

Das zeigt Benutzernamen und Home-Verzeichnisse.

Du kannst auch reguläre Ausdrücke als Trennzeichen verwenden:

awk -F '[,;]' '{ print $1 }' datei.csv

Das trennt an Kommas oder Semikolons.

Formatierte Ausgabe mit printf

Für kontrollierte Formatierung verwendest du printf:

awk '{ printf "%3d. %-10s %d Siege\n", NR, $1, $3 }' teams.txt

Ausgabe:

  1. Bucks      60 Siege
  2. Raptors    58 Siege
  3. 76ers      51 Siege
  4. Celtics    49 Siege
  5. Pacers     48 Siege

printf fügt keinen automatischen Zeilenumbruch ein, deshalb brauchst du \n.

Praktische Beispiele

Bestimmte Zeilen extrahieren

Die ersten 5 Zeilen ausgeben:

awk 'NR <= 5' logfile.txt

Zeilen 10 bis 20:

awk 'NR >= 10 && NR <= 20' logfile.txt

Summen und Durchschnitte berechnen

awk '{ sum += $3; count++ } END { print "Durchschnitt:", sum/count }' teams.txt

Das letzte Feld jeder Zeile ausgeben

awk '{ print $NF }' teams.txt

Leere Zeilen überspringen

awk 'NF > 0' datei.txt

Mehrere Dateien verarbeiten

awk '{ print FILENAME, $0 }' *.log

Shell-Variablen verwenden

Übergib Shell-Variablen mit der Option -v:

limit=50
awk -v n="$limit" '$3 > n { print $1 }' teams.txt

Awk-Programme in Dateien

Bei komplexeren Aufgaben lagerst du das Programm in eine Datei aus:

# analyse.awk
BEGIN { print "Auswertung:" }
$3 > 50 { print $1, "hat", $3, "Siege" }
END { print "Fertig." }

Aufruf:

awk -f analyse.awk teams.txt

Du kannst die Datei auch direkt ausführbar machen:

#!/usr/bin/awk -f
BEGIN { print "Start" }
{ print NR, $1 }

Nach chmod +x script.awk startest du es mit ./script.awk datei.txt.

Zusammenfassung

Awk verarbeitet Text spaltenweise und zeilenweise. Du definierst Muster, um Zeilen zu filtern, und Aktionen, um Daten zu extrahieren oder zu berechnen. Die Kombination aus eingebauten Variablen wie NF, NR und $1-$N macht awk zu einem der effizientesten Werkzeuge für Textverarbeitung auf der Kommandozeile.

Verwandte Artikel