Unterschiede zwischen den Revisionen 11 und 12
Revision 11 vom 2006-12-25 15:23:00
Größe: 4657
Autor: HJHerbert
Kommentar:
Revision 12 vom 2006-12-25 16:39:54
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)

TableOfContents

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.

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

Anleitung

Ein awk-Programm besteht aus drei Teilen:

  1. Ein Initialisierungsblock BEGIN { aktionen }
  2. Mehrere Verarbeitungsblöcke, bedingung x { aktionen x}
  3. 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


KategorieProgrammiersprachen KategorieAnleitung

AWK (zuletzt geändert am 2010-12-16 07:17:38 durch i5882C581)