13.2 Aufruf von awk-Programmen
Auch hier stellt sich die Frage, wie man awk aufrufen kann. Zunächst empfiehlt es sich, hierbei den Programmteil von awk in einzelne Anführungsstriche zu setzen, um Konflikte mit der Shell zu vermeiden. Die Syntax:
awk 'Programm' Datei [Datei] ...
awk 'Programm
Programm
Programm' Datei [Datei] ...
awk -f Programmdatei Datei [Datei]
Sie haben wieder die beiden Möglichkeiten, entweder alle awk-Kommandos direkt zwischen die Single Quotes zu schreiben oder Sie verwenden auch hier die Option –f (für file, wie bei sed), um alle Befehle von awk in eine Programmdatei (awk-Script) zu schreiben, um diese Programmdatei beim Start von awk auf die Datei(en) bzw. den Eingabestrom anzuwenden.
13.2.1 Grundlegender Aufbau eines awk-Kommandos
Im Abschnitt zuvor war die Rede von awk-Kommandos. Wie sehen denn nun solche Befehle aus? Ein reguläres awk-Kommando besteht aus mindestens einer Zeile.
Muster { Aktion }
Der Aktionsteil kann hierbei mehrere Befehle beinhalten und muss in geschweifte Klammern gesetzt werden. Nur so kann awk den Muster- und Aktionsteil voneinander unterscheiden. Beim Vergessen der geschweiften Klammern erhalten Sie ohnehin eine Fehlermeldung.
Wenn nun eine Datei geladen wurde, wird diese zeilenweise eingelesen und anhand eines Musters verglichen. Trifft entsprechendes Muster zu, wird der Aktionsteil ausgeführt. Beachten Sie bitte, dass nicht zwangsläufig ein Muster und ein Aktionsteil angegeben werden muss. Ein einfaches Beispiel (ich hoffe, Sie haben noch die Datei mrolympia.dat):
you@host > awk '$1 ~ "Samir"' mrolympia.dat
Samir Bannout Libanon 1983
Hier wurde als Muster der Name »Samir« verwendet, der im ersten Feld einer Zeile stehen muss ($1). Findet awk ein entsprechendes Muster, wird die Zeile ausgegeben. Wollen Sie hier nur die Nationalität ausgeben, benötigen Sie auf jeden Fall einen Aktionsteil:
you@host > awk ' $1 ~ "Samir" { print $3 }' mrolympia.dat
Libanon
Hier wird wiederum nach dem Muster »Samir« gesucht, das sich im ersten Feld einer Zeile befinden muss ($1). Aber anstatt die komplette Zeile auszugeben, wird hier nur das dritte Feld (bzw. Wort) ausgegeben ($3).
Andererseits müssen Sie auch nicht unbedingt ein Muster verwenden, um mit awk irgendetwas bewirken zu können. Sie können hierbei auch Folgendes schreiben:
you@host > awk '{ print }' mrolympia.dat
Larry Scott USA 1965 1966
Sergio Oliva USA 1967 1968 1969
Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975
...
Damit gibt awk den vollständigen Inhalt einer Datei aus. Wollen Sie nur die Nationalität (drittes Feld) ausgeben, so müssen Sie nur Folgendes schreiben:
you@host > awk '{ print $3 }' mrolympia.dat
USA
USA
Österreich
Argentinien
USA
Libanon
USA
Grossbritannien
USA
In der Praxis könnten Sie die einzelnen Nationalitäten jetzt zählen und der Rangfolge oder dem Alphabet nach ausgeben lassen. Aber bis dahin ist es noch ein etwas längerer (Lern-)Weg.
Natürlich ist es auch möglich, dass ein awk-Kommando aus mehreren Muster- und Aktionsteilen besteht. Jedes dieser Teile wird pro eingelesene Zeile einmal ausgeführt, wenn ein Muster zutrifft – vorausgesetzt, es wurde ein Muster angegeben.
Muster { Aktion }
Muster { Aktion }
Muster { Aktion }
Wurden alle Muster-Aktions-Teile ausgeführt, liest awk die nächste Zeile ein und beginnt wieder von vorn, alle Muster-Aktions-Teile zu durchlaufen.
13.2.2 Die Kommandozeilen-Optionen von awk
awk bietet nicht sehr viele Kommandozeilen-Optionen an. Wenn Sie wissen wollen, welche dies sind, müssen Sie awk ohne jegliche Argumente in der Kommandozeile eingeben:
you@host > awk
Anwendung: awk [POSIX- oder GNU-Optionen] -f PROGRAM [--] Datei
Anwendung: awk [POSIX- oder GNU-Optionen] -- 'PROGRAM' Datei ...
POSIX-Optionen GNU-Optionen (lang):
-f PROGRAM --file=PROGRAM
-F Feldtrenner --field-separator=Feldtrenner
-v var=Wert --assign=var=Wert
-W compat --compat
-W copyleft --copyleft
...
awk selbst verfügt eigentlich nur über die drei Optionen –F, –f und –v. Alle anderen Optionen mit –W sind GNU-spezifische Optionen, die eben nur gawk zur Verfügung stehen. Wobei es hier jedoch zwei sehr interessante Schalter gibt (sofern Sie gawk verwenden), mit denen Sie einen Kompatibilitätsmodus einschalten können:
Tabelle 13.1
GNU-spezifische Optionen für gawk (nicht nawk)
Option
|
Bedeutung
|
–W compat
|
gawk verhält sich wie ein UNIX-awk; damit werden alle GNU-Erweiterungen ausgeschaltet.
|
–W posix
|
gawk hält sich an den POSIX-Standard.
|
Die weiteren Optionen, die allen »awks« zur Verfügung stehen, lauten:
Tabelle 13.2
Standard-Optionen für awk
Option
|
Bedeutung
|
–F
|
Damit können Sie das/die Trennzeichen angeben, anhand dessen awk eine Zeile in einzelne Felder zerlegen soll. So verändern Sie die spezielle Variable FS.
|
–f
|
Angabe einer Datei (awk-Script) mit awk-Anweisungen
|
–v
|
Damit erzeugen Sie eine Variable mit einem vorbelegten Wert, der dem awk-Programm gleich zum Programmstart zu Verfügung steht.
|
13.2.3 awk aus der Kommandozeile aufrufen
Die einfachste Methode, awk zu verwenden, ist gleichzeitig auch die unpraktischste – nämlich aus der Kommandozeile. Unpraktisch dann, wenn Sie regelmäßig diverse Kommandos wiederholen bzw. immer wieder verwenden. Auch so genannte Einzeiler lohnt es, in einer Programmdatei abzuspeichern.
awk wurde bereits aus der Kommandozeile verwendet:
you@host > awk -F: '{print $3}' /etc/passwd
So legen Sie zuerst mit –F als Trennzeichen den Doppelpunkt fest. Anschließend filtern Sie mit awk alle User-IDs aus der Datei /etc/passwd aus und geben diese auf die Standardausgabe aus.
Damit können Sie wohl in der Praxis nicht viel anfangen. Warum also nicht die User-ID eines bestimmten Users ausfiltern? Mit grep und einer Pipe sollte dies nicht schwer sein:
you@host > grep you /etc/passwd | awk -F: '{print $3}'
1001
Sie haben erst mit grep nach einer Zeile in /etc/passwd mit der Textfolge »you« gesucht und die Ausgabe durch die Pipe an die Eingabe von awk weitergeleitet. awk filtert aus dieser Zeile nur noch die User-ID (Feld $3) aus.
13.2.4 awk in Shellscripts aufrufen
Die für Sie als Shell-Programmierer wohl gängigste Methode dürfte die Verwendung von awk in Shellscripts sein. Hierbei werden Sie entweder die einzelnen Befehle von awk direkt ins Script schreiben oder aber wiederum ein weiteres awk-Script mit dem Schalter –f ausführen lassen. Ein einfaches Beispiel:
# Name : who_uid
# Argumente vorhanden ... ?
usage() {
if [ $# -lt 1 ]
then
echo "usage: $0 user"
exit 1
fi
}
usage $*
uid=`grep $1 /etc/passwd | awk -F: '{ print $3 }'`
echo "Der User $1 hat die ID $uid"
Das Script bei der Ausführung:
you@host > ./who_uid tot
Der User tot hat die ID 1000
you@host > ./who_uid you
Der User you hat die ID 1001
you@host > ./who_uid root
Der User root hat die ID 0
Hier wurde mit einer einfachen Kommando-Substitution die User-ID wie im Abschnitt zuvor ermittelt und an eine Variable übergeben. Natürlich lassen sich auch ohne weiteres Shell-Variablen in awk verwenden:
# Name : readfield
printf "Welche Datei wollen Sie verwenden : "
read datei
printf "Welches Feld wollen Sie hierbei ermitteln : "
read feld
awk '{ print $'$feld' }' $datei
Das Script bei der Ausführung:
you@host > ./readfield
Welche Datei wollen Sie verwenden : mrolympia.dat
Welches Feld wollen Sie hierbei ermitteln : 2
Scott
Oliva
Schwarzenegger
...
13.2.5 awk als eigenes Script ausführen
awk-Scripts können Sie – wie auch viele andere Programme – mit der She-Bank-Zeile (#!) selbstständig laufen lassen. Sie müssen nur am Anfang Ihres awk-Scripts folgende Zeile einfügen:
#!/usr/bin/gawk -f
Wichtig ist hierbei die Option –f, denn nur dadurch wird das Script als auszuführende Programmdatei an awk übergeben. Hierzu ein simples awk-Script:
#!/usr/bin/awk –f
# Name : awkargs
BEGIN {
print "Anzahl Argumente: ", ARGC;
for (i=0; i < ARGC; i++)
print i, ". Argument: ", ARGV[i];
}
Das awk-Script (der Name sei »awkargs«) bei der Ausführung:
you@host > chmod u+x awkargs
you@host > ./awkargs Hallo awk wie gehts
Anzahl Argumente: 5
0 . Argument: awk
1 . Argument: Hallo
2 . Argument: awk
3 . Argument: wie
4 . Argument: gehts
Nachdem Sie das awk-Script ausführbar gemacht haben, zählt dieses Script alle Argumente der Kommandozeile zusammen und gibt die einzelnen Argumente auf dem Bildschirm aus. Natürlich können Sie awk-Scripts auch aus Ihren Shellscripts heraus starten. Dabei ist wie bei einem gewöhnlichen Kommando vorzugehen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|