AWK
Was ist awk?
Awk ist eine einfache Scriptsprache vorwiegend gebraucht zur Verarbeitung von Texdateien. Die drei Buchstaben awk
stehen für die Nachnamen der 3 Entwickler von awk: Alfred V. Aho, Peter J. Weinberger & Brian W. Kernighan.
Verwendung
Man hat beispielsweise eine lange Logdatei. Interessant sind aber nur wenige Daten. Mit awk kann die Datei Zeile für
Zeile abgearbeitet, die wichtigen Daten herausgefiltert und ein formatierter Report ausgegeben werden.
Wie führe ich awk aus?
Es gibt 2 Möglichkeiten awk auszuführen. Awk kann einerseits direkt über die Kommandozeile aufgerufen werden. Die
zweite Methode erlaubt dem Programmierer sein awk-script in einer Datei abzulegen und auf dieses aus der
Kommandozeile zu verweisen.
1. awk ’BEGIN{…}{…}END{…}’ [datei(en) die verarbeitet werden soll(en)]
2. awk –f awk-script [datei(en) die verarbeitet werden soll(en)]
Eingabe- und Ausgabedateien sind in awk optional. Als Standard liest awk vom Standardinput und Standardoutput.
Übungsbeispiele
$ awk ’{print}’ eingabedatei
Eingabedatei wird auf dem Standardoutput ausgegeben.
$ awk -F: '{print $5, $6}' /etc/passwd
Gibt Namen der Benutzer und das jeweilige Home-Verzeichnis aus.
$ ls -al | awk '{print NF}'
Gibt Anzahl Felder oder Spalten aus.
$ ls -al | awk '{a=a+$5} END{print a}'
Gibt Summe der Dateigrössen aus.
$ ls –al | awk '/^d/{print}'
Gibt nur Unterverzeichnisse eines Verzeichnisses aus.
Aufbau eines Awk-Scriptes
BEGIN{
#Der Code in diesem Abschnitt wird ausgeführt,
#bevor die Inputdaten abgearbeitet werden.
#Hier können user-definierte & built-in Variablen
#initialisiert und geändert werden.
Code ...
}
{
#In diesem Abschnitt werden die Inputdaten abgearbeitet.
Code ...
}
END{
#Nachdem alle Inputdaten abgearbeitet wurden,
#wird noch dieser Abschnitt ausgeführt.
#Auswertungen aus der Abarbeitung der Inputdaten
#können hier beispielsweise ausgegeben werden.
Code ...
}
Operatoren
* / % + - = ++ -- += -= *= /= %=
built-in-variables
Built-in-Variables sind Variabeln die in awk bereits bestehen.
$0 : Zeile
$1 : erstes Feld einer Zeile
$n: ntes Feld einer Zeile
NR: Zeilennummer
NF: Anzahl Felder einer Zeile
FS: Abgrenzungszeichen der Inputdaten (standard: white space, tab oder space)
... vollständige Liste siehe Anhang
built-in-functions
Built-in-Functions sind bestehende awk Funktionen.
print
length()
exit
split()
…mehr Funktionen & so unter:
http://www.cl.cam.ac.uk/texinfodoc/gawk_toc.html
http://www.clug.in-chemnitz.de/vortraege/awk/
http://www.sunsite.utk.edu/gnu/gawk/gawk_toc.html
http://stommel.tamu.edu/~baum/programming.html#awk
Bücher
sed & awk (2nd Edition)
by Dale Dougherty, Arnold Robbins im O’Reilly Verlag
Beispiel Script zur Berechnung des Notendurchschnittes
Hans Ruedi ist im 2. Semester an der ZHW und studiert Kommunikation & Informatik. Er hat bislang seine Noten mit dem
Notpad in ein ’bluttes’ Textfile geschrieben (siehe Notenliste). Hans Ruedi will nun wissen ob sich sein Notenbild zeigen
lässt und hat sich darum entschieden ein awk-script (siehe berechneDurchschnitt) zu schreiben, das ihm den
Notendurchschnitt berechnet.
notenliste
#Fach Note Gewicht
BWP 4.5 0.2
MA 6 1
PHT 2.75 1
SW 4.4 1
DB 5 1
IS 5.6 1
BWP 3.5 1
DT 4 1
E 4.5 1
SPK 5 1
KGS 5 1
MA 6 1
BWP 4.5 0.2
MA 6 1
SW 3.3 1
DT 6 1
MA 4.8 1
E 4.5 1
MA 5.5 1
BWP 4 1
MA 4.5 1
SW 4 0.5
berechneDurchschnitt
BEGIN{
#arrays initialisieren
split("BWP MA PHT SW DB DT IS E SPK KGS", fach)
split(0 0 0 0 0 0 0 0 0 0, note)
split(0 0 0 0 0 0 0 0 0 0, gewicht)
#variabeln initialisieren
fGruppe1=0
fGruppe2=0
fGruppe3=0
}
{
#hauptteil
#leere Zeile wird übersprungen
if(length($0) == 0) next
#falls die Zeile mehr als 3 Spalten hat wird das Programm abgebrochen
if(NF != 3){
print "Fehler! Zeile: "NR
exit
}
#arrays fach, noten und gewicht abfüllen
for( i = 1 ; i <= 10; i++){
if (fach[i] == $1){
note[i] += $2 * $3
gewicht[i]+= $3
}
}
}
END{
#AUSGABE AUSWERTUNG
print "************************************"
print "* irene haller 22.4.2002 *"
print "* Noten berechnen *"
print "************************************"
print "--------------------------"
print " durchschnitt fach"
print "--------------------------"
for(j=1; j <= 10; j++){
if(gewicht[j] != 0){
print fach[j] ":" note[j]/gewicht[j]
}
}
print "--------------------------"
print "Durchschnitt Faechergruppe"
print "--------------------------"
#sind noten vorhanden?
if(gewicht[1]!= 0 && gewicht[2] != 0 && gewicht[3]!= 0){
#dann wird der Durchschnitt berechnet
fgruppe1 = (((note[1]/gewicht[1]) * 6
+(note[2]/gewicht[2]) * 8
+(note[3]/gewicht[3]))/15)
print "bwp,ma,pht: " fgruppe1
}
if(gewicht[4] != 0 && gewicht[5] != 0 && gewicht[6] != 0 && gewicht[7]!= 0){
fgruppe2 = (((note[4]/gewicht[4]) * 2
+ (note[5]/gewicht[5])
+ (note[6]/gewicht[6])
+ (note[7]/gewicht[7]))/5)
print "sw,db,is,dt: " fgruppe2
}
if(gewicht[8] != 0 && gewicht[9] != 0 && gewicht[10] != 0){
fgruppe3 = (((note[8]/gewicht[8])
+ (note[9]/gewicht[9])
+ (note[10]/gewicht[10]))/3)
print "e,spk,kgs: " fgruppe3
}
print "--------------------------"
print " Gesamtdruchschnitt"
print "--------------------------"
if(fgruppe1 !=0 && fgruppe2 !=0 && fgruppe3 !=0){
print " " (fgruppe1 + fgruppe2 + fgruppe3)/3
}
}
Awk-script und Inputfile sind vorhanden. Jetzt muss Hans Ruedi nur noch den richtigen Befehl auf der Kommadozeile
absetzten:
$ awk –f berechneDurchschnitt notenliste