Awk
Grundlegendes
- Programmiersprache zur Bearbeitung und Auswertung von Textdaten
- Gibt es schon länger als Perl, Python usw
- Wird in Shellskripten eingesetzt
- AWK steht für drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan
- Ist praktisch auf jedem Unix/Linux verfügbar
- Arbeitet fast ausschließlich mit dem Datentyp Zeichenkette
Aufbau eines Programms
- Operationen – etwa Ersetzungen – auf einem Eingabetext durchzuführen.
- Text wird zeilenweise eingelesen
- Wird von Trenner in Felder aufgespalten
- Anschließend werden Anweisungen Zeilen angewandt
awk-Anweisungen haben folgende Struktur
Bedingung { Anweisungsblock }
- Zeilenweise wird gecheckt ob die Bedingung erfüllt ist
- Wenn Ja wird der Anweisungsblocks ausgeführt
- Es kann auch nur eine Aktion ausgeführt werden
{ Anweisungsblock }
- Es kann auch nur aus einer Bedingung bestehen
Bedingung
Variablen und Funktionen
- Variablen werden bei der Belegung definiert
- Gültigkeitsbereich ist in Regel global
- Funktionen können an beliebiger Stelle definiert werden
- Deklaration muss dabei nicht vor der ersten Nutzung erfolgen.
- Bei Skalaren_Variablen, werden Funktionsargumente als Wertparameter übergeben
- Sonst als Referenzparameter.
- Argumente bei Aufruf einer Funktion müssen nicht der Funktionsdefinition entsprechen
- überzählige Argumente werden als lokale Variablen behandelt
- Funktionen und Variablen haben den gleichen Namensraums
- Neben benutzerdefinierten Variablen und Funktionen stehen auch Standardvariablen und Standardfunktionen zur Verfügung, *
- $0 für die gesamte Zeile
- $1, $2 , … für das jeweils i-te Feld der Zeile
- FS für den Feldtrenner,
- Die Funktionen gsub(), split() und match().
- NR laufende Nummer des aktuellen Satzes im Eingabestrom
- NF Anzahl der Felder im aktuellen Satz
- RS Satz-/Zeilentrennzeichen, default:
- ORS output record separator
- FS Feldtrennzeichen, default: Leerzeichen und Tab
- OFS Feldtrennzeichen für die Ausgabe, default: Leerzeichen
Befehle
- Syntax ähnelt der Programmiersprache C
- Elementare Befehle
- sind Zuweisungen an Variablen
- Vergleiche zwischen Variablen
- Schleifen oder bedingte Befehlsausführungen
- fest implementierte Funktionen
- selbst programmierte Funktionen
- Ausgaben auf der Standardausgabe durch den print-Befehl
- Um etwa das zweite Feld einer Eingabezeile auszudrucken, wird der Befehl
print $2
benutzt.
Bedingungen
Bedingungen sind in awk-Programmen entweder von der Form
Ausdruck Vergleichsoperator Ausdruck
oder von der Form
Ausdruck Matchoperator /reguläres Suchmuster/
- Reguläre Suchmuster wie bei grep
- Matchoperator ~ für "Muster gefunden"
- Matchoperator !~ für "Muster nicht gefunden"
- Abkürzung für die Bedingung
- „$0 ~ /reguläres Suchmuster/“
- „/reguläres Suchmuster/“
- Spezielle Bedingungen gelten die Worte
- BEGIN wird vor der ersten Zeile ausgeführt
- END wird nach der letzten Zeile ausgeführt
Darüber hinaus können Bedingungen mit logischen Verknüpfungen zu neuen Bedingungen zusammengesetzt werden, z. B.
$1 ~ /^E/ && $2 > 20 { print $3 }
Dieser AWK-Befehl bewirkt, dass von jeder Zeile, die mit E beginnt und deren zweites Feld eine Zahl größer 20 ist, das dritte Feld ausgegeben wird.
Beispiele
Einige einfache Programmbeispiele, die man z. B. unter Linux einfach in einer Shell eingeben kann:
echo Hallo Welt | awk '{print $1}'
echo Hallo Welt | awk '{print $2}'
Test Datei
- cat partien.txt
Muenchen - Nuernberg 2 : 1 68000 Zuschauer Union - Moenchengladbach 1 : 1 21000 Zuschauer Berlin - Homburg 1 : 0 70000 Zuschauer Freiburg - Bremen 3 : 3 32000 Zuschauer Leverkusen - Dortmund 1 : 2 29000 Zuschauer Stuttgart - Mainz 3 : 1 50000 Zuschauer Leipzig - Koeln 1 : 3 45000 Zuschauer Frankfurt - Hoffenheim 2 : 1 40000 Zuschauer Duesseldorf - HSV 3 : 1 42000 Zuschauer
Beispiele
- Wenn das 4. Feld grösser als das 6. ist, wird das 1. Feld ausgegeben.
- awk '$4 > $6 { print $1 }' partien.txt ;
- Wenn das 4. Feld kleiner als das 6. ist, wird das 3. Feld ausgegeben.
- awk '$4 < $6 { print $3 }' partien.txt
- Wenn das 4. Feld gleich dem 6. ist, wird das 1.,2.,3. Feld ausgegeben.
- awk '$4 = $6 { print $1 " " $2 " " $3 }' partien.txt
- Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
- awk '{ print $1 " hatte ein Heimspiel mit " $7 " " $8} ' partien.txt
- Erste Zeile wird nicht ausgegeben
- awk 'NR>1 { print $0 }'
- IP in HEX umwandeln mit printf und xargs
- echo 192.168.240.188 | awk -F . ' { print $1,$2,$3,$4 }' | xargs -n 4 printf "%x:%x:%x:%x\n"
- FELD1 und FELD2 getrennt durch ein -
- awk ' BEGIN { FS=":" ; OFS="-" } $$7 ~ /bash$/ { print $1 , $3 }' /etc/passwd
- Alle User hintereinander
- awk ' FS=":" , ORS=" " { print $1 }' /etc/passwd
- Wer hat die bash als Shell
- awk -F : ' $7 ~ /bash$/ { print $1 }' /etc/passwd