Open Source im professionellen Einsatz

Sysadmin-Aufgaben mit AWK bewältigen

Reguläre Zaubereien

Tabellarisch aufgebaute Textfiles sind mit AWK bequem zu durchsuchen und zu verarbeiten. Gerade Admins schätzen an dem Sprachen-Klassiker, dass er auf jedem Unix-ähnlichen System zum Standard gehört. Dieser Artikel gibt eine Einführung.

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.

Listing 1:
Rechnerliste

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«.

Tabelle 1:
AWK-Operatoren

 

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

Tabelle 2:
Reguläre Ausdrücke

 

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

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook