Admins müssen bei ihrer täglichen Arbeit häufig Textdateien automatisch verarbeiten, sei es um Logfiles auszuwerten, Konfigurationen zu erzeugen oder zu ändern oder um neue Accounts anzulegen. Entsprechend vielfältig sind die Werkzeuge, die Unix und Linux hierfür anbieten: Von vergleichsweise einfachen Tools wie »sed« und »ed« bis zu ausgewachsenen Programmiersprachen wie Perl, Tcl oder gar C bleibt dem Admin eine breite Auswahl.
Zu den Klassikern gehört die handliche Programmiersprache AWK. Ihre Syntax ähnelt der von C, der Einstieg wird daher jedem C-Programmierer leicht fallen. Der Name AWK leitet sich von den drei Autoren Aho, Weinberger und Kernighan ab. Die frei (im Sinne der GPL) erhältliche AWK-Version »gawk«[1] gehört zum Standardumfang jeder Linux-Distribution.
Da auch die herkömmlichen Unix-Systeme AWK enthalten, eignet es sich besonders für plattformunabhängige Skripte. Wer Solaris, HP/UX und AIX-Server neben Windows- und Linux-Rechnern zu betreuen hat, wird kaum auf AWK verzichten wollen. Als Beispiel dient im Folgenden die Rechnerliste in Listing 1. Ihre Spalten enthalten Rechnername, IP-Adresse, Betriebssystem, Software und RAM-Größe.
DagobertDuck 10.1.1.3 Debian Kylix 256
Goofy1 10.1.1.4 Solaris Mathematica 512
MickeyMouse 10.1.1.5 Debian Apache 512
LuckyLuke1 10.1.1.6 Debian Samba 256
LuckyLuke2 10.1.1.7 Debian Eclipse 256
LuckyLuke3 10.1.1.8 Suse Mupad 256
LuckyLuke4 10.1.1.9 Debian Mupad 128
LuckyLuke43 10.1.1.10 Debian Mupad 128
LuckyMickeyMouse 10.1.1.11 Debian Mupad 128
Asterix1 10.1.1.12 RedHat NetBeans 128
Asterix2 10.1.1.13 Debian NFS 256
Obelix 10.1.1.14 RedHat ICC 256
Apfel1 10.1.1.15 OSX Photoshop 1024
Apfel2 10.1.1.16 OS6 Photoshop 128
Apfel3 10.1.1.17 OSX Photoshop 512
|
Arbeitsprinzip
Ein AWK-Skript verarbeitet seine Eingabedatei zeilenweise und untersucht sie nach Mustern. Findet es eine passende Stelle, führt AWK eine definierte Aktion aus. Hat der Programmierer kein Muster angegeben, führt AWK die Aktion für jede Zeile aus. Bei einfachen Einzeilern bietet sich folgende Aufrufkonvention an:
gawk 'AWK-Programm' Eingabedateien
Größere AWK-Skripte sind in einer eigenen Datei besser aufgehoben. Der Aufruf lautet dann »gawk -f Skriptdatei Eingabefiles«. Als Erstes soll AWK alle Rechnernamen aus der Beispieldatei (Listing 1) listen:
gawk '{print $1}' liste
Das Feld »$1« entspricht der ersten Spalte. Wer lieber die IP-Adressen wissen will, ersetzt »$1« durch »$2«. Die komplette Zeile entspricht »$0«: Der Aufruf »gawk \'{print $0}\' liste« gibt die komplette Datei auf dem Bildschirm aus.
Musterspiele
Alle Information zum Rechner mit Namen Goofy1 lassen sich mit Hilfe eines Musters ermitteln:
gawk '$1=="Goofy1" {print $0}' liste
AWK prüft in jeder Zeile, ob in der Spalte »$1« genau das Muster »Goofy1« auftritt. Wenn ja, gibt »{print $0}« die ganze Zeile aus. Statt des Gleichheitsoperators »==« würde der Negationsoperator »!=« dafür sorgen, dass AWK das Kommando nur ausführt, wenn das Muster nicht passt (siehe Tabelle 1). Das Kommando »gawk \'$1 != "Goofy1" {print $0}\' liste« dagegen schreibt den Inhalt jener Zeilen auf die Standardausgabe, bei denen der String »Goofy1« nicht in der ersten Spalte auftritt.
Nicht nur einzelne Muster lassen sich mit AWK ermitteln, sondern auch Bereiche. Der folgende Aufruf benutzt zwei reguläre Ausdrücke (siehe Tabelle 2), die jeweils in Schrägstrichen eingeschlossen sind und von AWK mit der ganzen Zeile verglichen werden:
gawk '/Goofy1/,/Asterix/ {print $0}' liste
Als Ausgabe erscheint der komplette Bereich vom Muster »Goofy1« bis einschließlich »Asterix1«.
|
|
|
Operator
|
Erklärung
|
|
$
|
Feldoperator
|
|
++ -
|
Postfix-Inkrement und -Dekrement
|
|
++ -
|
Präfix-Inkrement und -Dekrement
|
|
^
|
Potenzierung
|
|
!
|
logische Negation
|
|
+ -
|
Vorzeichen-Operationen
|
|
* / %
|
Multiplikation, Division, Modulo-Operation
|
|
+ -
|
Addition, Subtraktion
|
|
<
|
kleiner als
|
|
<=
|
kleiner oder gleich
|
|
==
|
gleich
|
|
!=
|
ungleich
|
|
Operator
|
Erklärung
|
|
>=
|
größer oder gleich
|
|
>
|
größer
|
|
~ !~
|
Vergleich mit regulärem Ausdruck
|
|
&&
|
logisches UND
|
|
||
|
logisches ODER
|
|
=
|
Zuweisung
|
|
+=
|
Addition und Zuweisung
|
|
-=
|
Subtraktion und Zuweisung
|
|
*=
|
Multiplikation und Zuweisung
|
|
/=
|
Division und Zuweisung
|
|
%=
|
Modulo-Operation und Zuweisung
|
|
^=
|
Potenzierung und Zuweisung
|
|
|
|
Ausdruck
|
Erklärung
|
|
.
|
Ersetzt irgendein Zeichen
|
|
^
|
Findet den folgenden regulären Ausdruck nur am Anfang einer Zeile
|
|
$
|
Findet den vorangehenden regulären Ausdruck nur am Ende einer Zeile
|
|
[ ]
|
Findet ein beliebiges der in Klammern eingeschlossenen Zeichen
|
|
[a-d1-7]
|
Zeichenklassen mit Bereichen: alle Buchstaben von a bis d und Ziffern von 1 bis 7
|
|
X?
|
Deckt entweder kein oder genau ein X ab
|
|
X*
|
Deckt kein oder mehrere X ab
|
|
X|Z
|
Deckt X oder Z ab
|
|
XZ
|
Deckt X unmittelbar gefolgt von Z ab
|