Awk

Aus Xinux Wiki
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 Kombination mit 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 Trennerin 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 }
  • oder auch nur aus einer Bedingung
  Bedingung

Variablen und Funktionen

Der Benutzer kann Variablen innerhalb von Anweisungsblöcken durch Referenzierung definieren, eine explizite Deklaration ist nicht notwendig. Der Gültigkeitsbereich in Regel der Variablen ist global.

Funktionen können an beliebiger Stelle definiert werden, die Deklaration muss dabei nicht vor der ersten Nutzung erfolgen. Falls es sich um Skalare_Variable handelt, werden Funktionsargumente als Wertparameter übergeben, ansonsten als Referenzparameter. Die Argumente bei Aufruf einer Funktion müssen nicht der Funktionsdefinition entsprechen, überzählige Argumente werden als lokale Variablen behandelt, ausgelassene Argumente mit dem speziellen Wert uninitialized – numerisch Null und als Zeichenkette den Wert des leeren Strings – versehen.

Funktionen und Variablen aller Art bedienen sich des gleichen Namensraums, so dass gleiche Benennung zu undefiniertem Verhalten führt.

Neben benutzerdefinierten Variablen und Funktionen stehen auch Standardvariablen und Standardfunktionen zur Verfügung, beispielsweise die Variablen $0 für die gesamte Zeile, $1, $2 , … für das jeweils i-te Feld der Zeile und FS (von engl. Vorlage:Lang) für den Feldtrenner, sowie die Funktionen gsub(), split() und match().

Befehle

Die Syntax von awk ähnelt derjenigen der Programmiersprache C. Elementare Befehle sind Zuweisungen an Variablen, Vergleiche zwischen Variablen sowie Schleifen oder bedingte Befehlsausführungen (if-else). Daneben gibt es Aufrufe sowohl zu fest implementierten als auch zu selbst programmierten Funktionen.

Ausgeben von Daten auf der Standardausgabe ist durch den print-Befehl möglich. 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 werden wie beim grep-Befehl gebildet, und Matchoperatoren sind ~ für "Muster gefunden" und !~ für "Muster nicht gefunden". Als Abkürzung für die Bedingung „$0 ~ /reguläres Suchmuster/“ (also die ganze Zeile erfüllt das Suchmuster) kann „/reguläres Suchmuster/“ verwendet werden.

Als spezielle Bedingungen gelten die Worte BEGIN und END, bei denen die zugehörigen Anweisungsblöcke vor dem Einlesen der ersten Zeile bzw. nach Einlesen der letzten Zeile ausgeführt werden.

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

Links