AWK - der Musterknabe aus der UNIX-Welt

Dr. W.A. Slaby


    

Zeilen aus einem Text herausfiltern zu lassen, in denen ein bestimmtes Muster (pattern) vorkommt, die Textspalten eines entsprechend aufgebauten Textes anders anordnen: Dies sind nur zwei Anwendungsbeispiele für das aus der UNIX-Welt bekannte Programm AWK zur Manipulation von Texten und Zahlen.

Funktionsweise von AWK

Gesteuert durch ein sogenanntes AWK-Programm, welches aus einer Reihe von pattern und ihnen zugeordneten Aktionen besteht, prüft AWK jede eingelesene Zeile der Eingabedatei auf das Vorkommen des durch das jeweilige pattern gegebenen Textmusters in dieser Zeile; bei erfolgreicher Lokalisierung des Textmusters wird die diesem pattern zugeordnete Aktion ausgeführt.

So sorgt beispielsweise der Pattern-Action-Befehl

     NR == 5 { print }
dafür, daß die fünfte Zeile der Eingabedatei ausgegeben wird. NR ist dabei eine eingebaute Variable, in der AWK die Anzahl der bisher eingelesenen Zeilen verwaltet. Wie man an diesem Beispiel sieht, besteht jeder Pattern-Action-Befehl aus einem logischen Ausdruck, der von einer in geschweiften Klammern eingeschlossenen Liste von C-ähnlichen Programmbefehlen gefolgt wird.

Felder und Records

Etwas exakter formuliert ist jede Eingabedatei für AWK eine Folge von records (üblicherweise Zeilen), die wiederum in sogenannte fields unterteilt werden. Ein Feld (field) ist dabei eine Zeichenkette, die durch den sogenannten field separator begrenzt wird. In seiner einfachsten Form besteht ein Feld aus einer Zeichenkette, die von Zwischenräumen (Blanks oder Tabs) umgeben ist. Allerdings kann der field separator durch Angabe eines regulären Ausdrucks auch beliebig komplex gestaltet werden.

Die Felder des laufenden Records können mit dem Dollar-Operator $ angesprochen werden, z.B.

     $3 <  10 { print NR, $0 }
mit dem das laufende Record $0 dann ausgegeben wird, wenn das dritte Feld aus einer Zahl besteht, die kleiner als 10 ist.

Reguläre Ausdrücke

Die bisher verwendeten Vergleichsausdrücke NR == 5 und $3 < 10 sind als pattern eher ungewöhnlich, da sie kein Suchmuster im eigentlichen Sinne darstellen. Echte Suchmuster werden vielmehr als reguläre Ausdrücke gebildet, deren einfachste Vertreter eine feste Zeichenkette beschreiben, z.B.

     /text/
Dieses Suchmuster paßt auf jede Eingabezeile, die an irgendeiner Stelle die Zeichenkette "text" enthält.

Ein etwas komplexerer regulärer Ausdruck wird durch Alternation gebildet, z.B.

     /text|datum/
oder äquivalent dazu als logischer Ausdruck geschrieben
     /text/ || /datum/
Dieses Suchmuster trifft auf alle Eingabezeilen zu, die eine der Zeichenketten "text" oder "datum" enthalten. Zusätzlich lassen sich als Suchmuster auch sogenannte Zeichenkettenklassen verwenden:
     /[0-9]/
paßt auf Eingabezeilen, die irgendeine Ziffer enthalten, während auf
     /[a-zA-Z]/
irgendein Buchstabe des Alphabetes paßt. Eine spezielle Zeichenkettenklasse ist der Punkt, auf den ein beliebiges Zeichen paßt.

Aus diesen einfachen Mustern können durch Wiederholungsoperatoren komplexere gebildet werden. Drei solcher Operatoren stehen zur Verfügung: der Stern * für kein oder mehrere Vorkommen eines Musters, das Pluszeichen + für ein oder mehrere Vorkommen eines Musters und schließlich das Fragezeichen ? für genau ein oder kein Vorkommen eines Musters. So paßt beispielsweise das Muster

     /[0-9]+/
auf eine beliebige nicht-negative ganze Zahl.

Wenn sich die Mustersuche nicht auf die gesamte Eingabezeile sondern nur auf ein bestimmtes Feld erstrecken soll, kann das durch den Such-Operator ~ veranlaßt werden:

     $2+ ~ /ff/ { print $2, $3 }
Schließlich läßt sich durch Negation des Such-Operators !~ erreichen, daß alle diejenigen Eingabezeilen ermittelt werden, auf die das Suchmuster nicht paßt.

Programmaufruf:

Normalerweise wird AWK in der Form

     awk -f < awk-datei> < eingabedatei>
aufgerufen. < awk-datei> bezeichnet dabei eine typischerweise mit der Extension *.awk versehene Datei, die aus gültigen Pattern-Action-Befehlen besteht. Eine detaillierte Übersicht über andere Varianten des Aufrufs von AWK erhält man durch
     awk -?
Eine ausführliche Dokumentation steht in den Dateien AWK.DOC und AWK.MAN im Verzeichnis I:\UTIL\AWK+ zur Verfügung.

Literatur:

Aho, A.V./Kernighan, B.W./Weinberger, P.J.:
   The AWK programming language
   Addison--Wesley 1988, ISBN 0-201-07981-X

Dougherty, D.:
   SED &  AWK
   O'Reilly, ISBN 0-937175-59-5


 Ansprechpartner im URZ:

Tomasz Partyka          Zimmer EI: eO-107     CEO-Mail: partyka
                        Tel.: -296            PMail: tomasz.partyka                      
Dr. Wolfgang A. Slaby   Zimmer Ei: eO-109a    CEO-Mail: slaby 
                        Tel.: -214/-462       PMail: wolfgang.slaby