Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 13 awk-Programmierung
  gp 13.1 Einführung und Grundlagen von awk
    gp 13.1.1 History und Versionen von awk
    gp 13.1.2 Die Funktionsweise von awk
  gp 13.2 Aufruf von awk-Programmen
    gp 13.2.1 Grundlegender Aufbau eines awk-Kommandos
    gp 13.2.2 Die Kommandozeilen-Optionen von awk
    gp 13.2.3 awk aus der Kommandozeile aufrufen
    gp 13.2.4 awk in Shellscripts aufrufen
    gp 13.2.5 awk als eigenes Script ausführen
  gp 13.3 Grundlegende awk-Programme und -Elemente
    gp 13.3.1 Ausgabe von Zeilen und Zeilennummern
    gp 13.3.2 Felder
  gp 13.4 Muster (bzw. Adressen) von awk-Scripts
    gp 13.4.1 Zeichenkettenvergleiche
    gp 13.4.2 Vergleichsausdrücke
    gp 13.4.3 Reguläre Ausdrücke
    gp 13.4.4 Zusammengesetzte Ausdrücke
    gp 13.4.5 BEGIN und END
  gp 13.5 Die Komponenten von awk-Scripts
    gp 13.5.1 Variablen
    gp 13.5.2 Arrays
    gp 13.5.3 Operatoren
    gp 13.5.4 Kontrollstrukturen
  gp 13.6 Funktionen
    gp 13.6.1 Mathematische Funktionen
    gp 13.6.2 Funktionen für Zeichenketten
    gp 13.6.3 Funktionen für die Zeit
    gp 13.6.4 Systemfunktionen
    gp 13.6.5 Ausgabefunktionen
    gp 13.6.6 Eingabefunktion
    gp 13.6.7 Benutzerdefinierte Funktionen
  gp 13.7 Empfehlung


Rheinwerk Computing

13.2 Aufruf von awk-Programmedowntop

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.


Rheinwerk Computing

13.2.1 Grundlegender Aufbau eines awk-Kommandos  downtop

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.


Rheinwerk Computing

13.2.2 Die Kommandozeilen-Optionen von awk  downtop

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.


Rheinwerk Computing

13.2.3 awk aus der Kommandozeile aufrufen  downtop

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.


Rheinwerk Computing

13.2.4 awk in Shellscripts aufrufen  downtop

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

Rheinwerk Computing

13.2.5 awk als eigenes Script ausführen  toptop

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.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern