Home / LinuxUser / 2005 / 10 / Awk – Werkzeug und Skriptsprache

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 46 Punkte (3 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...