Awk

Aus xinux.net
Zur Navigation springen Zur Suche springen

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

Optionen

Feldtrenner

  • -F :

Vergleiche

kleiner

  • <<

grösser

  • <<

gleich

  • ==

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.

While-Schleife

  • Der Aufbau und Syntax ähnelt der Programmiersprache C sehr
  • awk 'BEGIN {i = 0 ; while (i <= 5) { print i ; i++ }}'
1
2
3
4
5

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 : 2		21000 Zuschauer
Berlin -  Schalke			1 : 2		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 - MSV 			1 : 3		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
Feld 1, 7 und 8 werden mit Text dazwischen ausgegeben.
  • awk '{ print $1 " hatte ein Heimspiel mit " $7 " " $8} ' partien.txt
Alle Zuschauer
  • awk '{ sum += $7 } END { print "Gesamtzahl der Zuschauer:", sum }' partien.txt
Erste Zeile wird nicht ausgegeben
  • awk 'NR>1 { print $0 }'
IP in HEX umwandeln
  • echo 192.168.240.188 | awk ' BEGIN {FS="."} { printf "%x:%x:%x:%x" , $1 ,$2, $3, $4 }'
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 'BEGIN {FS=":" ; ORS=" "} { print $1 }' /etc/passwd
Wer hat die bash als Shell
  • awk -F : ' $7 ~ /bash$/ { print $1 }' /etc/passwd

Aufgaben

Links