Inhaltsverzeichnis
Vorwort
AWK ist eine von Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan erdachte Programmier-Sprache, die besonders zur Verarbeitung von Textdateien (wie z.B. Logfiles) geeignet ist.
Die Programmiersprache AWK (TU Chemnitz) Super Beispiele
AWK ist besonders stark beim Scripting. Typisch ist "quick 'n dirty", oder als Hilfe zum Konfigurieren von Source-Code.
Implementationen
Auf GNU/Linux Systemen wird meist gawk (GNU awk) oder das schlankere mawk (Mike's awk) benutzt.
Anwendungen
Ein besonderer Fall von Anwendung ist das Awkiawki - ein Wiki komplett geschrieben in AWK!
Anleitung
Ein awk-Programm besteht aus drei Teilen:
- Ein Initialisierungsblock BEGIN { aktionen }
- Mehrere Verarbeitungsblöcke, bedingung x { aktionen x}
- Ein Abschlußblock (kann sein) END { aktionen }
Der Initialisierungsblock wird durchgeführt, bevor die erste Zeile eingelesen wird. Der Abschlußblock wird nach Bearbeitung aller Zeilen aller Dateien ausgeführt.
Verarbeitung:
awk liest eine Zeile, prüft die erste Bedingung, führt die Verarbeitung durch, prüft dann die zweite Bedingung, usw. Die Bedingung kann sein :
- Ein regulärer Ausdruck, z.B. /text/
- Ein Bereich angegeben durch Bedingung der ersten und letzten Zeile, z.B.: /START/, /ENDE/
Ein Vergleich: z.B.: length>50
Durch besondere Variablen kann zugegriffen werden auf:
- $0
- Die gesamte Eingabezeile
- $1
- Das erste Feld
- FS
- Das Feldtrennzeichen kann gesetzt werden. FS=, FS=; , oder im Aufruf mit -F: Wenn nichts angegeben ist, dann ist da Leerzeichen und Tabulator.
- ARGC
- Anzahl der Argumente der Kommandozeile
- ARGV[]
- die Argumente der Kommandozeile
- FILENAME
- Name der aktuellen Eingabedatei (Im einem Aufruf könnten mehrere Dateien offen sein)
- FNR
- Zeilennummer
- NF
- Anzahl der Felder der Eingabe $NF ist das letzte Feld, $NF-1 das vorletzte
- OFMT
- (Output Format) Das Standard-Ausgabeformat : %.6g
- OFS
- (Output Field Separator) Ausgabefeldtrennung. Normalerweise ein Leerzeichen
- ORS
- (Output Record Separator) Ausgabezeilentrennung.
- RS
- (Input record separator)
Beispiel 1
Ersetzen einer Zeile in vielen Dateien
for i in *; do awk '/^DASS MUSS WEG$/ { print "das muss rein"; next }; { print }' $i > $i.tmp mv $i.tmp $i done
Beispiel 2
Datei bsp:
oo ii d.zz nozzle Buzz Olitz.xx.zz.cc.vv g.zz zz.zz.zz.z.z.zzzu uu.xx uu.zz d.zz dsd.zz
Datei cmd:
{ print $1 } END { print "END CMD" } BEGIN { print "AUS CMD" }
Folgende Befehlszeile wurde in bash eingegeben :
gawk -f cmd bsp >erg
Die erzeugte Ergebnisdatei erg:
AUS CMD oo d.zz g.zz dsd.zz END CMD
Dies zeigt
- Es kann 3 Blöcke von Kommandos geben (muß aber nicht) : Jeder Block ist in {} gefaßt. Ihre Reihenfolge ist egal.
print $1 druckt nur das erste Feld (Hier durch ' ' getrennt) print $2 hätte das zweite Feld gedruckt.
Beispiel: Erzeugen von HTML-Tabellen mit awk
Datei bsp :
16.5.07;Schuhe;24.53 19.6.97;Computer, VAX;24 182.34 30.9.97;Enten, tiefgefroren; 14.95
Datei cmd :
BEGIN { FS=";"; printf "<table border>\n" } { printf("<tr>") for ( n=1 ; n <= NF ; ++n ) printf( "<td>%s</td>",$n) printf("</tr>"); printf("\n") } END { printf "</table>\n" }
Folgende Befehlszeile wurde in bash eingegeben :
gawk -f cmd bsp >erg
Datei erg :
<table border> <tr><td>16.5.07</td><td>Schuhe</td><td>24.53</td></tr> <tr><td>19.6.97</td><td>Computer, VAX</td><td>24 182.34</td></tr> <tr><td>30.9.97</td><td>Enten, tiefgefroren</td><td> 14.95</td></tr> </table>
Dieses Beispiel demonstriert, wie mit awk eine Tabelle umformatiert werden kann. Der HTML-Browser zeigt dann :
16.5.07 |
Schuhe |
24.53 |
19.6.97 |
Computer, VAX |
24 182.34 |
30.9.97 |
Enten, tiefgefroren |
14.95 |
Dies zeigt :
mit FS = wird das Spaltentrennzeichen gesetzt
- Wenn mehrere Befehle auf einer Zeile sind, dann durch ; trennen