Größe: 4657
Kommentar:
|
Größe: 4749
Kommentar: Awka
|
Gelöschter Text ist auf diese Art markiert. | Hinzugefügter Text ist auf diese Art markiert. |
Zeile 19: | Zeile 19: |
* [http://awka.sourceforge.net/ Awka] - AWK nach C Konverter (und benötigte Bibliothek) |
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.
[http://www.faqs.org/faqs/computer-lang/awk/faq/ FAQ von comp.lang.awk]
[http://cm.bell-labs.com/cm/cs/awkbook/ AWK book]
[http://www.uni-giessen.de/hrz/betsys/unix/artikel/awk.html Kurze Einführung]
[http://www.linuxfibel.de/awk.htm AWK in der Linuxfibel]
AWK ist besonders stark beim Scripting. Typisch ist "quick 'n dirty", oder als Hilfe zum Konfigurieren von Source-Code.
Implementationen
[http://www.gnu.org/software/gawk/ gawk] GNU AWK
[http://freshmeat.net/projects/mawk/ mawk] - Mike's AWK
[http://cm.bell-labs.com/cm/cs/awkbook/index.html awk] - Das Original
[http://awka.sourceforge.net/ Awka] - AWK nach C Konverter (und benötigte Bibliothek)
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 [http://awkiawki.bogosoft.com/ 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 ;= 3 ; ++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