Ein Tool für alle Fälle
Awk – Werkzeug und Skriptsprache
Anfang und Ende
Zu den bereits vorgestellten Bedingungen im Hauptteil einer Awk-Skriptdatei kommen die beiden speziellen Muster BEGIN und END hinzu. Diese beiden Anweisungsblöcke sind für die Auswertung von Dateien sehr wichtig: Die Befehle im BEGIN-Block führt Awk vor dem Einlesen der ersten Datenzeile aus. Sie dienen zum Initialisieren des Skripts und zum Setzen von Variablen. Wenn Sie zum Beispiel das Trennzeichen für die Eingabe oder für die Ausgabe ändern möchten, können Sie dort die Variable OFS setzen. Der BEGIN-Block kann jedoch auch zur Ausgabe eines Tabellenkopfes dienen.
Die Befehle im END-Block werden nach dem Einlesen der letzten Datenzeile ausgeführt. Sie dienen oft der Auswertung der eingelesenen Daten. Dort können Sie beispielsweise Summen und Mittelwerte bilden oder einen Tabellenfuß an die Ausgabe anhängen.
Wenn beide Blöcke in einem Awk-Skript enthalten sind, lohnt es sich meist, das Skripts in einer separaten Datei zu speichern. Sie können diese Dateien mit jedem Texteditor (zum Beispiel Emacs oder Vi) erstellen. Die meisten Editoren bieten eine Syntaxhervorhebung und für Awk und eine Klammerkontrolle an.
Auswertung eines Logfiles
Viele größere Netzwerkdrucker und Printserver protokollieren alle Druckaufträge in einer Textdatei. Zu den protokollierten Daten gehören die Auftraggeber der Druckjobs, das Seitenformat, die Anzahl der Seiten und frei wählbare Datenfelder für Projektkostenstellen oder andere Angaben. Jede Zeile enthält den Datensatz eines Druckauftrags. Im Listing 2 sehen Sie den Tabellenkopf und einige Beispieldatensätze aus der Datei printlog.txt.
Listing 2
Document User Device Format Medium col b/w KstSt C2.sxw LAGO pr04 DIN_A4 Normal 1 10 P01 vortr.pdf LEHM pr03 DIN_A4 Normal 0 10 P01 angebot.doc LOHN pr01 DIN_A4 Normal 3 0 P02
Die Awk-Scripte für diese Aufgabe haben (je nach Formatierung) eine Länge von etwa sechs bis acht Zeilen. Sie sind in den Beispielen zu diesem Artikel enthalten. Wenn Ihnen diese nicht zur Verfügung stehen, erstellen Sie das in Listing 3 abgedruckte Skript bitte mit einem Texteditor und speichern es als auswertung1.awk ab.
Beginnen wir mit einer einfachen Auswertung der Anzahl aller schwarz-weiß oder bunt gedruckten Seiten. Dazu wird je eine Variable für die beiden Summen mitgeführt, die mit jeder gefundenen Zeile erhöht wird.
Listing 3
#Auswertung der Anzahl der gedruckten Seiten
NR==1 {
next;
}
{
summe_color+=$6;
summe_bw+=$7;
}
END {
print summe_color " Farbdrucke";
print summe_bw " Schwarz/Weiss-Drucke";
}
Rufen Sie das Script mit awk -f auswertung1.awk printlog.txt auf. Durch den Aufruf wird zuerst die Skriptdatei geladen. Dann wendet Awk die Befehle des Skripts auf printlog.txt an.
Der Befehl next überspringt eine Zeile, falls NR==1. So wird die erste Zeile, die den Tabellenkopfs enthält, ingnoriert. Es wäre auch möglich, diese Zeile in einer Variablen zu speichern und am Ende auszugeben.
Für jede weitere Zeile erhöht Awk die Variablen summe_color und summe_bw nun um die Anzahl der farbig (Feld $6) oder schwarzweiß (Feld $7) gedruckten Seiten. Am Ende werden beide Summen ausgegeben. Die Auswertung dieser Druckaufträge pro Kostenstelle ist eine etwas komplexere Aufgabe, die Awk jedoch ebenfalls sehr gut lösen kann (siehe Listing 4 und auswertung2.awk).
Listing 4
# Auswertung der Anzahl schwarz-weiss
# gedruckter Seiten pro Kostenstelle
NR==1 {
next;
}
{drucke[$8]+=$7}
END {
print "KstSt. Anzahl";
for (F in drucke) {print F " " drucke[F]}
}
Auch hier überspringt der next-Befehl die erste Zeile. Für alle anderen Zeilen soll die Anzahl der Schwarzweiß-Drucke pro Kostenstelle ausgewertet werden. Mit dem Befehl drucke[$8]+=$7 wird der Wert für die jeweilige Kostenstelle im Arrayfeld drucke[] um die Anzahl der Seiten im Feld $7 erhöht.
Wenn alle Datensätze gelesen sind, wertet eine Schleife das Datenfeld drucke im END-Block aus. Dabei wird die aufsummierte Anzahl der Druckseiten für jede Kostenstelle ausgegeben.
Das Array drucke[] ist in diesem Beispiel durch den Namen der Kostenstelle indiziert. In den Beispielen zu diesem Artikel finden Sie zusätzlich noch das Skript auswertung3.awk, mit dem alle Drucke der einzelnen Nutzer summiert werden. Dort werden zwei Datenfelder mitgeführt.



