awk(1) awk(1)
NAME
awk, nawk - Programmierbare Bearbeitung von Textdateien
SYNTAX
awk [-Fc] [-v initialisierung] ... [--] prog [initialisierung ...]
[datei ...]
BESCHREIBUNG
awk ist ein programmgesteuertes Textbearbeitungssystem.
Sie geben beim Aufruf des awk das auszuführende awk-Programm und die
Namen der zu bearbeitenden Dateien an. awk führt dann die durch das
Programm festgelegte Bearbeitung mit den angegebenen Dateien aus. awk
verändert die Eingabedateien nicht. Standardmäßig schreibt awk das
Ergebnis der Bearbeitung auf die Standardausgabe.
Im Vergleich zu Textbearbeitungsprogrammen wie egrep und sed bietet
awk folgende Vorteile:
- awk arbeitet satzweise. Ein Eingabesatz ist zwar wie bei egrep und
sed standardmäßig eine Zeile, der Benutzer kann diese Einstellung
aber ändern und andere Texteinheiten als Satz definieren.
- Jeder Eingabesatz ist in Felder aufgeteilt, die einzeln angespro-
chen werden können.
- Eine Auswahlbedingung kann eine aus erweiterten regulären Ausdrük-
ken und Vergleichen zusammengesetzte Bedingung sein.
- Der Benutzer kann beliebige Aktionen programmieren. Die awk-Sprache
ist eine höhere, C-ähnliche Programmiersprache.
Die Beschreibung des awk gliedert sich in folgende Abschnitte:
⊕ Verwendungsmöglichkeiten für awk
⊕ Struktur eines awk-Programms
⊕ Arbeitsweise von awk
⊕ Die Eingabedatei (Sätze, Felder, Vordefinierte Variablen)
⊕ Grundelemente der awk-Sprache (Kommentare, Konstanten, Variablen)
⊕ Ausdrücke
⊕ Auswahlbedingungen
⊕ Aktionen (Ablaufanweisungen, Funktionen).
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
OPTIONEN
-Fc Trennzeichen zwischen den Feldern eines Eingabesatzes festlegen.
c Regulärer Ausdruck zur Bestimmung des Trennzeichens zwischen
den Feldern eines Eingabesatzes. Das Trennzeichen gehört
nicht zu einem Feld.
Hinweis:
Wenn Sie als Trennzeichen zwischen den Feldern eines Einga-
besatzes das Zeichen "t" verwenden wollen, so müssen Sie es
beim awk-Aufruf oder im BEGIN-Teil des awk-Programms folgen-
dermaßen angeben:
awk -F[t] ... oder BEGIN {FS=t ...}
-Fc nicht angegeben:
Leer- und Tabulatorzeichen gelten als Feldtrenner.
-v initialisierung
Wertzuweisung der Form var=wert
awk initialisiert die Variable var, die im Programm vorkommt, mit
wert.
var Name der Variablen, die initialisiert werden soll.
wert Wert, mit dem die Variable var initialisiert werden soll.
wert kann genauso definiert werden, wie eine Umgebungsva-
riable in der Shell.
-- Ende der Optionenliste. Die Angabe ist nötig, wenn das erste
Argument mit - beginnt.
prog Angabe des awk-Programms.
prog kann sein:
'awk-programm', ein awk-Programm in der Kommandozeile, oder
-f progdat, der Name einer Datei, die ein awk-Programm enthält.
'awkprogramm'
Ein awk-Programm in der Kommandozeile.
Sie sollten das awk-Programm immer in Hochkommata '...' ein-
schließen, um Shell-Sonderzeichen vor ungewollter Auswertung
durch die Shell zu schützen. Wenn das Programm länger als
eine Zeile ist, dann müssen Sie das Neue-Zeile-Zeichen durch
einen Gegenschrägstrich \ entwerten.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel:
Alle Zeilen aus der Datei eingabe ausgeben, deren drittes
Feld aus dem Zeichen "0" besteht:
$ awk '$3 == 0' eingabe
-f progdat
Das awk-Programm steht in der Datei progdat.
Sie können mehrere awk-Programme angeben. Vor jedem awk-Pro-
gramm muß dabei -f stehen. Bei mehreren Angaben verarbeitet
awk die Dateien in der angegebenen Reihenfolge.
initialisierung
Wertzuweisung der Form: var=wert.
awk initialisiert die Variable var (egal, ob diese im awk-Pro-
gramm vorkommt oder nicht) mit wert. initialisierung und datei
können in beliebiger Reihenfolge angegeben werden. Die Wertzuwei-
sung erfolgt zu dem Zeitpunkt, zu dem normalerweise die an der
Position stehende Datei geöffnet worden wäre.
Ausnahme:
Die $-Variablen (siehe GRUNDELEMENTE DER AWK-SPRACHE unten) kön-
nen nicht auf diese Weise initialisiert werden.
var Name der Variablen, die initialisiert werden soll. Die
Variable darf nicht mit $ beginnen.
wert Wert, mit dem die Variable var initialisiert werden soll.
wert kann genauso definiert werden wie eine Umgebungsva-
riable in der Shell.
datei
Name der Textdatei, die bearbeitet werden soll. Sie können meh-
rere Dateien angeben. Bei mehreren Angaben verarbeitet awk die
Dateien in der angegebenen Reihenfolge. Wenn Sie für datei einen
Bindestrich - angeben, liest awk von der Standardeingabe.
datei nicht angegeben:
awk liest von der Standardeingabe. awk liest die Eingabe satz-
weise ein, bearbeitet sie und gibt nach jeder Zeile das Ergebnis
für diesen Satz aus. Sie beenden die Eingabe mit <CTRL-D>.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Bekannte Fehler
Die Wertzuweisung über initialisierung erfolgt - im Gegensatz zu der
Beschreibung unter initialisierung (siehe oben) - bereits vor Aufruf
des awk-Skripts. Ab SINIX V5.43 wird eine Wertzuweisung vor Beginn des
awk-Skripts nur noch über "-v initialisierung" möglich sein, so wie
von XPG4 festgelegt.
VERWENDUNGSMÖGLICHKEITEN FÜR AWK
awk ist ein Werkzeug, mit dem Sie Textbearbeitungsaufgaben bequem
lösen können. Typische Anwendungen sind:
- Daten aus Dateien heraussuchen
- Dateiinhalte überprüfen
- Berechnungen mit den Daten in einer Datei durchführen
- Format der Eingabedaten ändern.
Dieser Abschnitt zeigt an vier einfachen Beispielen, wie Sie awk
anwenden können.
Die Datei artikel enthält eine Aufstellung von Büroartikeln. Angegeben
sind jeweils der Artikelname, die Stückzahl und der Einzelpreis:
Bleistift 1500 0.60
Tisch 5 345.00
Lampe 20 79.80
Papier 75 1.00
Diskette 1000 2.40
Umschlag 100 0.20
Beispiel 1
Alle Artikel heraussuchen, deren Stückzahl größer als 100 ist:
$ awk '$2 > 100 {print}' artikel
Bleistift 1500 0.60
Diskette 1000 2.40
Mit $2 sprechen Sie das zweite Feld einer Zeile an, das in diesem Bei-
spiel die Stückzahl eines Artikels enthält. Wenn die Stückzahl größer
als 100 ist, ist die Bedingung erfüll die Funktion print wird ausge-
führt. Da für print keine Argumente angegeben sind, gibt print die
ganze Zeile aus.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel 2
Für alle Artikel mit einer Stückzahl größer als 100 den Gesamtpreis
berechnen und zusammen mit der Artikelbezeichnung ausgeben:
$ awk '$2 > 100 {print $1 "\t" $2*$3}' artikel
Bleistift 900
Diskette 2400
In diesem Beispiel hat die print-Funktion drei Argumente. Ausgegeben
werden:
$1 Artikelbezeichnung (erstes Feld)
\t Tabulatorzeichen
$2*$3 Stückzahl (zweites Feld) mal Einzelpreis (drittes Feld)
Beispiel 3
Die Ausgabe mit einer Überschrift versehen:
$ awk 'BEGIN {print "Artikelbezeichnung \tGesamtbetrag"}
> $2 > 100 {print $1 "\t\t" $2*$3}' artikel
Artikelbezeichnung Gesamtbetrag
Bleistift 900
Diskette 2400
Dieses Beispiel zeigt die Verwendung des BEGIN-Teils. awk führt die
Aktion hinter BEGIN nur einmal bei Start des Programms aus. Deshalb
wird die Überschrift genau einmal am Anfang ausgegeben.
Beispiel 4
Am Ende die Summe aller Beträge ausgeben:
Dazu wird eine Variable summe verwendet, die im BEGIN-Teil mit 0
initialisiert wird. Für jede Zeile wird das Produkt aus zweiter und
dritter Spalte aufaddiert:
$ awk 'BEGIN {summe=0; print "Artikelbezeichnung \tGesamtbetrag"}
> $2 > 100 {print $1 "\t\t" $2*$3; summe += $2*$3}
> END {print "\nSumme: " summe}' artikel
Artikelbezeichnung Gesamtbetrag
Bleistift 900
Diskette 2400
Summe: 3300
Dieses Beispiel zeigt die Verwendung des END-Teils. awk führt die
Aktion hinter END nur einmal vor Beendigung des Programms aus. Deshalb
wird die Summe aller Beträge genau einmal am Ende ausgegeben.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
STRUKTUR EINES AWK-PROGRAMMS
Ein awk-Programm kann aus einem BEGIN-, Haupt- und END-Teil bestehen,
die nach folgendem Schema aufgebaut sind:
______________________________________________________________________
[ BEGIN {aktion} ] BEGIN-Teil
[[auswahlbedingung] {aktion} Hauptteil
| auswahlbedingung [{aktion}]
| funktionsdefinition
.
.
.
]
[ END {aktion} ] END-Teil
______________________________________________________________________
auswahlbedingung
Mit auswahlbedingung gibt der Benutzer an, welche Daten aus den
Eingabedateien ausgewählt werden sollen (siehe Auswahlbedingungen
unten).
aktion
Mit aktion gibt der Benutzer an, was geschehen soll, wenn Daten
entsprechend auswahlbbedingung auftreten (siehe Aktionen unten).
funktionsdefinition
Mit funktionsdefinition hat der Benutzer die Möglichkeit, eigene
Funktionen zu definieren (siehe FUNKTIONEN unten).
Mindestens einer der drei Teile auswahlbedingung, aktion, funktionsde-
finition muß vorhanden sein.
Von einem Paar auswahlbedingung {aktion} kann entweder die Auswahlbe-
dingung oder die Aktion fehlen. Fehlt aktion, so wird jeweils die
durch auswahlbedingung erfaßte Zeile ausgegeben. Fehlt auswahlbedin-
gung, so wird aktion für jede Zeile ausgeführt.
Die Definition einer benutzerdefinierten Funktion kann an beliebiger
Stelle im Hauptteil erfolgen.
Es ist erforderlich, daß folgende Teile jeweils am Anfang einer Zeile
(nach beliebig vielen Leer- oder Tabulatorzeichen) stehen:
- der BEGIN-Teil
- die Paare [auswahlbedingung]{aktion} bzw. auswahlbedingung
[{aktion}]
- die Funktionsdefinition
- der END-Teil
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
ARBEITSWEISE VON AWK
awk führt das vom Benutzer angegebene awk-Programm aus. Dabei geht awk
im einzelnen wie folgt vor:
1. Anfangsarbeiten
Wenn Variablen angegeben wurden, so werden als erstes diese Varia-
blen initialisiert. Falls ein BEGIN-Teil mit aktion vorhanden ist,
führt awk dann die dort festgelegte Aktion aus. Die im BEGIN-Teil
angegebene Aktion wird genau einmal ausgeführt, und zwar vor der
Bearbeitung der ersten Eingabezeile.
2. Dateibearbeitung
Anschließend verarbeitet awk die angegebenen Eingabedateien. awk
liest die Eingabesätze der Reihe nach ein. Für jeden Eingabesatz
prüft awk jede Auswahlbedingung ab und zwar in der Reihenfolge, wie
sie im awk-Programm angegeben sind. Wenn eine Auswahlbedingung
zutrifft, wird die zugehörige Aktion ausgeführt.
Wenn zu einer Aktion keine Auswahlbedingung angegeben ist, führt
awk die Aktion für jeden Satz aus. Wenn zu einer Auswahlbedingung
keine Aktion angegeben ist, ist die Standard-Aktion Ausgabe des
Satzes.
Mehrere Eingabedateien werden in der angegebenen Reihenfolge abge-
arbeitet.
3. Abschlußarbeiten
Wenn alle angegebenen Dateien abgearbeitet sind und ein END-Teil
vorhanden ist, dann führt awk zum Schluß die im END-Teil angegebene
Aktion aus. Danach beendet sich awk.
DIE EINGABEDATEI
Eine Eingabedatei besteht aus Sätzen, die in Felder eingeteilt sind.
Sätze
Die Sätze sind durch ein Satztrennzeichen getrennt. Die Satztrennzei-
chen sind nicht Bestandteil des Satzes. Standardmäßig ist ein Satz
eine Zeile und das Satztrennzeichen ist das Neue-Zeile-Zeichen. Der
Benutzer hat die Möglichkeit, diese Einteilung zu ändern. Dazu gibt es
die vordefinierte Variable RS (RS - Record Separator), der Sie ein
beliebiges Zeichen zuweisen können. Falls als Wert für RS eine Zei-
chenkette angegeben wird, wird nur das erste Zeichen dieser Zeichen-
kette berücksichtigt. Die Anzahl der aktuell verarbeiteten Sätze wird
in der Variablen NR (NR - Number of Records) gezählt. Bei mehreren
Eingabedateien wird NR über alle Dateien hochgezählt. Auf den aktuel-
len Satz können Sie mit der vordefinierten Variablen $0 zugreifen.
Näheres zu Variablen erfahren Sie im Abschnitt GRUNDELEMENTE DER AWK-
SPRACHE .
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Felder
Jeder Satz ist in Felder unterteilt, die durch ein oder mehrere Feld-
trennzeichen getrennt sind. Standardmäßig ist eine beliebig lange
Folge von Leer- und Tabulatorzeichen ein Feldtrenner. Der Benutzer hat
die Möglichkeit, diese Einteilung zu ändern. Dazu gibt es die vordefi-
nierte Variable FS (FS - Field Separator), der Sie entweder beim Auf-
ruf durch Angabe der Option -F oder im awk-Programm ein beliebiges
anderes Zeichen zuweisen können. Der an FS zugewiesene Wert wird als
erweiterter regulärer Ausdruck [siehe expressions(5)] interpretiert.
Beispiel 1
Sie wollen die Zeichen x und y als alternative Feldtrenner definieren.
Syntax beim awk-Aufruf: -F"[xy]"
Syntax im awk-Programm: FS="[xy]"
Beispiel 2
Sie wollen eine beliebig lange Folge des Zeichens x als Feldtrenner
definieren.
Syntax beim awk-Aufruf: -Fx+
Syntax im awk-Programm: FS=x+
Die Standard-Einstellung (beliebig lange Folge von Leer- und Tabula-
torzeichen) kann also mit dem folgenden regulären Ausdruck dargestellt
werden: "[<blank>\t]+" (<blank> steht hier für das Leerzeichen, \t für
das Tabulatorzeichen).
Beachten Sie, daß ein Neue-Zeile-Zeichen immer als Feldtrenner inter-
pretiert wird, egal welchen Wert FS hat!
Die Anzahl der Felder des aktuellen Satzes wird in der Variablen NF
(NF - Number of Fields) gespeichert. Auf die einzelnen Felder des
aktuellen Satzes können Sie mit den vordefinierten Variablen $1, $2
bis $NF zugreifen. Näheres zu Variablen erfahren Sie im Abschnitt
GRUNDELEMENTE DER AWK-SPRACHE.
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel 1
Standard-Einteilung
1. Feld 2. Feld ... 5. Feld
Das ist der erste Satz <-- 1. Satz
|_| |_| |__|
und das ist der zweite Satz <-- 2. Satz
|_| |__|
1. Feld ... 6. Feld
Beispiel 2
Nicht-Standard-Einteilung: RS="%"; FS=":";
1. Feld 2. Feld 3.Feld
%Name : Adresse : Telefonnummer <-- 1. Satz
|______| |_______| |____________|
1. Feld 2. Feld
%Zasse Franz:Zur Waarthe 46a, 33106 Paderborn --\
|_________| |______________________________| |-> 2. Satz
05251-9324% __/
|________|
3. Feld
Regeln für Satz- und Feldtrennzeichen
⊕ Standard-Einstellungen für Satztrenner
- Standardmäßig ist das Neue-Zeile-Zeichen das Satztrennzeichen.
- Wenn RS die leere Zeichenkette ist (RS=""), besteht die Datei
aus einem einzigen Satz. Falls mehrere Dateien angegeben werden,
besteht jede Datei aus einem einzigen Satz (NR hat am Ende die
Anzahl der Dateien als Wert).
⊕ Standard-Einstellungen für Feldtrenner
- Wenn der Satztrenner das Neue-Zeile-Zeichen ist, dann gelten
standardmäßig Leer- und Tabulatorzeichen als Feldtrenner.
- Wenn der Satztrenner nicht das Neue-Zeile-Zeichen ist, dann gilt
das Neue-Zeile-Zeichen immer als Feldtrenner, unabhängig davon,
welches Zeichen als Feldtrenner definiert ist (siehe Felder
oben, Beispiel 2).
- Wenn Sie FS explizit das Leerzeichen zuweisen, durch Aufruf von
awk mit -F" " oder mit der Zuweisung FS=" ", dann gelten Leer-
und Tabulatorzeichen als Feldtrenner.
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
- Wenn Sie dagegen FS explizit das Tabulatorzeichen zuweisen
(FS="\t"), dann gilt nur noch das Tabulatorzeichen als Feldtren-
ner, das Leerzeichen nicht mehr.
⊕ Führende Feldtrenner und Folgen von Feldtrennern
- Für die Feldtrenner Leer-, Tabulator- und Neue Zeile-Zeichen
gilt:
1. Führende Feldtrenner werden ignoriert.
2. Beliebige Folgen von Feldtrennern werden als ein Trennzeichen
gezählt (siehe Beispiel 9).
- Bei jedem anderen Feldtrenner werden führende Feldtrenner
gezählt. Bei einer Folge von Feldtrennern wird jedes Zeichen
einzeln gezählt. Zwei aufeinanderfolgende Feldtrenner ergeben
daher ein leeres Feld (siehe Beispiel 10).
⊕ Einteilungen verändern
Sie können RS im awk-Programm verändern, wenn Sie für eine Datei
verschiedene Satzeinteilungen benötigen. Der neue Satztrenner gilt,
sobald die Zuweisung an RS ausgeführt wurde. Ebenso können Sie FS
im awk-Programm verändern, wenn Sie für eine Datei verschiedene
Feldeinteilungen benötigen. Der neue Feldtrenner gilt, sobald die
Zuweisung an FS ausgeführt wurde.
Vordefinierte Variablen für die Eingabedatei
Die folgende Tabelle enthält alle vordefinierten awk-Variablen, die
die Eingabedatei betreffen. In der zweiten Spalte ist angegeben, mit
welchem Wert awk diese Variable standardmäßig belegt.
Seite 10 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
_______________________________________________________________________
| Variable | Wert, den awk in der Variablen speichert |
|___________|__________________________________________________________|
| FILENAME | Name der aktuellen Eingabedatei, - bei Standardeingabe |
|___________|__________________________________________________________|
| FS | Feldtrenner für die Eingabe. Standard: beliebig lange |
| | Folge von Leer- und Tabulatorzeichen. |
|___________|__________________________________________________________|
| NF | Anzahl der Felder des aktuellen Satzes |
|___________|__________________________________________________________|
| NR | Laufende Nummer des aktuellen Satzes im Input |
|___________|__________________________________________________________|
| FNR | Laufende Nummer des aktuellen Satzes in der aktuellen |
| | Datei |
|___________|__________________________________________________________|
| RS | Satztrenner für die Eingabe. Standard: Neue-Zeile- |
| | Zeichen. |
|___________|__________________________________________________________|
| $0 | Aktueller Satz |
| $1 | Erstes Feld des aktuellen Satzes |
| $2 | Zweites Feld des aktuellen Satzes |
| ... | |
| $NF | Letztes Feld des aktuellen Satzes |
|___________|__________________________________________________________|
Sie können die Variablen im awk-Programm verändern. Die Eingabedatei
wird dadurch aber nicht verändert. Näheres zu Variablen erfahren Sie
im nächsten Abschnitt GRUNDELEMENTE DER AWK-SPRACHE.
GRUNDELEMENTE DER AWK-SPRACHE
In diesem Abschnitt sind die Grundelemente der awk-Sprache zusammenge-
stellt. Die Grundelemente benötigen Sie bei der Formulierung von Aus-
wahlbedingungen und Aktionen.
Kommentar
Sie können ein awk-Programm wie eine Shell-Prozedur kommentieren. Kom-
mentar beginnt mit dem Zeichen # und geht bis zum Ende der Zeile.
Konstanten
Es gibt zwei Arten von Konstanten:
______________________________________________________________________
zahl
zeichenkette
______________________________________________________________________
Seite 11 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
zahl Eine Zahl (numerische Konstante) ist eine Ganzzahl oder eine
Gleitkommazahl mit oder ohne Vorzeichen. awk überprüft das Format
nicht. Wenn eine Zahl ungültige Zeichen enthält, versucht awk
einen gültigen Teil herauszufiltern und ignoriert den Rest.
ganzzahl
Eine Ganzzahl ist eine Folge aus den Ziffern 0 bis 9.
gleitkommazahl
Eine Gleitkommazahl besteht aus Mantisse mit oder ohne Expo-
nent. Die Mantisse besteht aus einer Ganzzahl mit oder ohne
Nachkommateil. Der Nachkommateil besteht aus einem Dezimal-
punkt und einer Ganzzahl.
zeichenkette
Eine Zeichenkette (alphanumerische Konstante) ist eine Folge von
Zeichen, eingeschlossen in Anführungszeichen "...". Fehlen die
Anführungszeichen, dann interpretiert awk die Zeichenkette als
Variablennamen, Zahl oder Operator.
zeichen
Ein Einzelzeichen wird auch in Anführungszeichen "..." ein-
geschlossen, damit awk das Zeichen nicht als Variablennamen
interpretiert. Ein Zeichen ist ein darstellbares Zeichen aus
dem aktuell gültigen Zeichensatz [siehe ascii(5) und
meta-ascii(5)] oder eines der folgenden Sonderzeichen, die
wie in C dargestellt werden:
\" für "
\\ für \
\n für Neue-Zeile-Zeichen
\t für Tabulatorzeichen
\b für Rücksetzzeichen (backspace)
\r für Wagenrücklauf (carriage return)
\f für Seitenvorschub
Variablen
awk ermöglicht die Verwendung von einfachen Variablen und Arrays, um
Werte abzuspeichern. Es gibt vordefinierte und benutzerdefinierte
Variablen.
Variablenname
Der Name einer benutzerdefinierten Variablen fängt entweder mit
einem Unterstrich _, einem Großbuchstaben oder einem Kleinbuch-
staben an und besteht nur aus Unterstrichen, Groß- und Kleinbuch-
staben sowie Ziffern. Interne Begriffe von awk, z. B. Ablaufan-
weisungen, dürfen nicht als Variablennamen verwendet werden.
Seite 12 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Datentyp
Variablen haben keinen Datentyp. Sie können derselben Variablen
sowohl eine Zahl als auch eine Zeichenkette zuweisen. In einem
eindeutig numerischen Kontext werden Variablen als numerische
Variablen behandelt, ansonsten gelten sie standardmäßig als
alphanumerisch. Die Konvertierung von numerischen in alphanumeri-
sche Variablen wird intern mit dem in CONVFMT abgelegten Format
durchgeführt.
Beispiel:
x = "Mueller"; # die Variable x enthält die Zeichenkette Mueller
x = "3"+4 ; # die Variable x hat den Wert 7
Definition
Variablen werden nicht explizit definiert. Benutzerdefinierte
Variablen sind mit der ersten Verwendung automatisch definiert.
Initialisierung
Die vordefinierten Variablen werden von awk wie vorgesehen
belegt. Benutzerdefinierte Variablen werden von awk standardmäßig
je nach Kontext mit der leeren Zeichenkette bzw. mit Null initia-
lisiert. Bei Aufruf von awk können Sie andere Initialisierungen
angeben.
Ausnahmen:
- Für i>NF ist $i nicht unbedingt die leere Zeichenkette.
- $-Variablen können nicht bei Aufruf initialisiert werden.
Vordefinierte Variablen
awk kennt die in der Tabelle aufgeführten vordefinierten Variablen. In
der Tabelle ist angegeben, welche Werte awk standardmäßig in diesen
Variablen speichert. Der Benutzer kann den Variablen neue Werte zuwei-
sen.
Seite 13 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
______________________________________________________________________
| Variable | Wert, den awk in der Variablen speichert |
|___________|_________________________________________________________|
| ARGC | Anzahl der Elemente im Array ARGV. |
|___________|_________________________________________________________|
| ARGV | Array, das die Argumente der Kommandozeile enthält |
| | (ausgenommen Optionen und das Argument prog), numeriert|
| | von 0 bis ARGC-1. |
|___________|_________________________________________________________|
| CONVFMT | Format für die interne Konvertierung von Zahlen in Zei-|
| | chenketten (siehe awk-Funktionen, printf). Standard: |
| | %%%%.6g, höchstens 6 Stellen hinter dem Komma. |
|___________|_________________________________________________________|
| ENVIRON | Array mit den Werten der Umgebungsvariablen, die Indi- |
| | zes sind die Namen der Variablen. |
|___________|_________________________________________________________|
| FILENAME | Name der aktuellen Eingabedatei, - bei Standardeingabe.|
|___________|_________________________________________________________|
| FS | Feldtrenner für die Eingabe. Standard: beliebig lange |
| | Folge von Leer- und Tabulatorzeichen. |
|___________|_________________________________________________________|
| NF | Anzahl der Felder des aktuellen Satzes. |
|___________|_________________________________________________________|
| NR | Laufende Nummer des aktuellen Satzes im Input. |
|___________|_________________________________________________________|
| FNR | Laufende Nummer des aktuellen Satzes in der aktuellen |
| | Datei. |
|___________|_________________________________________________________|
| OFS | Feldtrenner für die Ausgabe. Standard: Leerzeichen. |
|___________|_________________________________________________________|
| ORS | Satztrenner für die Ausgabe. Standard: Neue-Zeile- |
| | Zeichen. |
|___________|_________________________________________________________|
| OFMT | Ausgabeformat für Gleitkommazahlen (siehe FUNKTIONEN |
| | unten, printf). Standard: %%%%.6g, höchstens 6 Stellen |
| | hinter dem Komma. |
|___________|_________________________________________________________|
| RS | Satztrenner für die Eingabe. Standard: Neue-Zeile- |
| | Zeichen. |
|___________|_________________________________________________________|
Seite 14 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
______________________________________________________________________
| RLENGTH | Länge der Zeichenkette, die die match-Funktion als pas-|
| | send erkannt hat. |
|___________|_________________________________________________________|
| RSTART | Anfangsposition der Zeichenkette, die die match-Funk- |
| | tion als passend erkannt hat. Die Numerierung fängt mit|
| | 1 an. Dieser Wert entspricht immer dem Return-Wert der |
| | match-Funktion. |
|___________|_________________________________________________________|
| SUBSEP | Subscript-Zeichenketten-Trenner für mehrdimensionale |
| | Arrays. Standard-Einstellung ist \034. |
|___________|_________________________________________________________|
| $0 | Aktueller Satz. |
|___________|_________________________________________________________|
| $n | n-tes Feld des aktuellen Satzes. |
|___________|_________________________________________________________|
| $NF | Letztes Feld des aktuellen Satzes. |
|___________|_________________________________________________________|
Wie wirkt sich die Änderung von vordefinierten Variablen aus?
Beispiel:
Durch die Zuweisung
$1 = "neu";
wird $1 die Zeichenkette neu zugewiesen. Das erste Feld des aktuellen
Eingabesatzes bleibt aber unverändert.
Das gilt auch für folgende awk-Einstellungen, die die Eingabedatei
betreffen:
1. Die aktuelle Eingabedatei ändert sich nicht, wenn Sie FILENAME
einen neuen Namen zuweisen.
2. Wenn Sie an eine Variable $i mit i>NF einen Wert zuweisen, bekommt
NF den Wert i zugewiesen.
3. Wenn Sie NR einen neuen Wert zuweisen, wird nur die Zeilennummer
verändert, aber die Einstellung, welcher Satz der aktuelle ist,
bleibt unverändert.
Beispiel:
Der Inhalt von $0 bleibt unverändert, auch wenn NR verändert
wird.
{print NR, $0; NR=NR+34; print NR, $0}
Seite 15 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Die Ausgabe sieht dann etwa so aus:
10 Dies ist die zehnte Zeile
44 Dies ist die zehnte Zeile
Vorsicht:
Wenn Sie einer Variablen einen neuen Wert zuweisen, wird der alte
Inhalt gelöscht. Wenn Sie z. B. NF verändern, ist die Information
über die Feld-Anzahl des aktuellen Satzes verloren.
Besonderheit bei $-Variablen:
Sie können die Nummer einer $-Variablen als Konstante angeben oder
durch einen Ausdruck, der bei Auswertung die Nummer ergibt.
Beispiel:
Mit:
$(NF-1)
sprechen Sie das vorletzte Feld an.
Array
Ein Array ist ein Feld von Konstanten oder Variablen.
Ein Array-Element wird angesprochen mit:
______________________________________________________________________
arrayname[index]
______________________________________________________________________
arrayname
Variablenname.
index
einfache Variable. Der Index kann numerisch oder alphanumerisch
sein. Sie können für index daher eine Zahl, eine Zeichenkette
oder einen Ausdruck angeben, der bei Auswertung den Indexwert
ergibt.
awk bietet bezüglich Arrays zwei besondere Möglichkeiten:
⊕ Arrays werden dynamisch angelegt:
Arrays werden wie einfache Variablen nicht deklariert, insbesondere
muß auch keine Dimension festgelegt werden. Bei Bedarf wird automa-
tisch ein neues Array-Element angelegt.
Seite 16 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
⊕ Arrays können assoziativ durchlaufen werden:
Sie können einen alphanumerischen Index verwenden, um die Array-
Elemente anzusprechen. Zum Durchlaufen aller Elemente eines asso-
ziativen Arrays gibt es die spezielle Laufanweisung:
for(index in array) anweisung
index durchläuft in unbestimmter Reihenfolge die bisher vorhandenen
Indexwerte. Für jedes Array-Element wird anweisung einmal ausge-
führt (siehe Ablaufanweisung for).
Beispiel:
In der Datei ausgaben sind Ausgaben erfaßt. Für jede Ausgabe sind Tag,
Monat, Betrag und eine Kurzbeschreibung angegeben. Die einzelnen Anga-
ben sind durch Doppelpunkt : getrennt, z. B.:
01:Januar: 40.78:Buerobedarf
05:Januar: 6789.00:Laser-Drucker
23:Maerz: 240.32:Lampen
11:Januar: 478.00:Stuehle
01:Februar: 45.00:Literatur
Durch Verwendung eines assoziativen Arrays können Sie aus dieser Datei
sehr einfach die Gesamtausgaben für jeden Monat berechnen. Das Bei-
spielprogramm verwendet das Array mausgaben und die Monatsnamen als
alphanumerischen Index. Für jede Zeile werden die Ausgaben im dritten
Feld ($3) zu den Ausgaben des Monats addiert, der in dem zweiten Feld
($2) steht.
$ awk 'BEGIN {FS=":"}
> {mausgaben[$2] += $3;}
> END {for (i in mausgaben) print "Gesamtausgaben",
> i, mausgaben[i]}' ausgaben
Gesamtausgaben Februar 45
Gesamtausgaben Maerz 240.32
Gesamtausgaben Januar 7307.78
Ausdrücke
Ein Ausdruck kann sein:
- konstante
- variable
- funktionsaufruf
- unop ausdruck
Seite 17 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
- ausdruck binop ausdruck
- (ausdruck)
- ausdruck ? ausdruck : ausdruck
konstante
numerische oder alphanumerische Konstante (siehe GRUNDELEMENTE DER
AWK-SPRACHE oben).
variable
Variable (siehe GRUNDELEMENTE DER AWK-SPRACHE oben).
funktionsaufruf
Aufruf einer vordefinierten Funktion (siehe FUNKTIONEN unten).
ausdruck
Ausdruck.
unop
unitärer Operator (siehe Operator-Tabelle unten).
binop
binärer Operator (siehe Operator-Tabelle unten).
Ausdrücke werden ausgewertet und liefern einen Wert. Sie können in
Auswahlbedingungen und Aktionen vorkommen.
awk-Operatoren
awk kennt alle C-Operatoren und zusätzlich die Operatoren für Muster-
vergleich und Konkatenation von Zeichenketten. In der folgenden
Tabelle sind alle awk-Operatoren nach steigender Priorität aufgeführt.
Operatoren in einer Reihe haben die gleiche Priorität.
Achtung:
Die Prioritäten haben sich gegenüber früheren Versionen geändert
(z. B. "!"). Überprüfen Sie bestehende awk-Programme auf nicht eindeu-
tige Bindungen.
Seite 18 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Operatoren
_____________________________________________________________________________
|Operation | Operator | Beispiel| Erläuterung |
|_________________________|______________|_________|________________________|
|Zuweisung | = += -= *=| x *= 2 | x = x * 2 |
| | /= %= ^= | | |
|_________________________|______________|_________|________________________|
|Bedingter Ausdruck | ?: | x?y:z | Falls x wahr, dann y, |
| | | | sonst z |
|_________________________|______________|_________|________________________|
|Logisches ODER | || | y || y | 1 falls x oder y wahr, |
| | | | 0 andernfalls |
|_________________________|______________|_________|________________________|
|Logisches UND | && | x && y | 1 falls x und y wahr |
| | | | sind, 0 andernfalls |
|_________________________|______________|_________|________________________|
|Array-Zugehörigkeit | in | i in a | 1 falls a[i] existiert,|
| | | | 0 andernfalls |
|_________________________|______________|_________|________________________|
|Mustervergleich | ~ !~ | $1 ~ /x/| 1 falls das erste Feld |
| | | | ein x enthält, 0 |
| | | | andernfalls |
|_________________________|______________|_________|________________________|
|Vergleich | < <= == !=| x == y | 1 falls x gleich y ist,|
| | >= > | | 0 andernfalls |
|_________________________|______________|_________|________________________|
|Verkettung | | "a" "bc"| "abc"; es gibt keinen |
| | | | expliziten Verkettungs-|
| | | | operator |
|_________________________|______________|_________|________________________|
|Addition, Subtraktion | + - | x + y | Summe von x und y |
|_________________________|______________|_________|________________________|
|Multiplikation, Division,| * / % | x % y | Rest von x geteilt |
|Modulus | | | durch y |
|_________________________|______________|_________|________________________|
|Unäres Plus und Minus | + - | -x | Negierter Wert von x |
|_________________________|______________|_________|________________________|
|Logisches NICHT | ! | !$1 | 1 falls $1 null ist, 0 |
| | | | andernfalls |
|_________________________|______________|_________|________________________|
|Exponent | ^ ** | x ^ y | x hoch y |
|_________________________|______________|_________|________________________|
|Inkrement, Dekrement | ++ -- | ++x, x++| Addiere 1 zu x |
|_________________________|______________|_________|________________________|
|Feld | $ | $i+1 | Wert des i-ten Felds, |
| | | | plus 1 |
|_________________________|______________|_________|________________________|
|Klammerung | ( ) | ($i)++ | Addiere 1 zum Wert des |
| | | | i-ten Felds |
|_________________________|______________|_________|________________________|
Seite 19 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Auswertung von Ausdrücken
Für die Operanden ist kein Datentyp vorgeschrieben. Sie können numeri-
sche und alphanumerische Konstanten beliebig mischen. awk bestimmt aus
dem Kontext, ob eine numerische oder alphanumerische Operation ausge-
führt wird.
Beachten Sie, daß es wie in C keine speziellen Wahrheitswerte gibt.
Bei awk gilt wie bei C Null als falsch und ein Wert ungleich Null als
wahr. Dies bedeutet, als Argument einer logischen Operation wird jeder
Wert ungleich 0 als wahr erkannt. Das Ergebnis einer solchen Operation
wird, wenn es wahr ist, durch 1 dargestellt.
Beispiel:
$4 ~ /Asien/
ist 1, falls das vierte Feld der aktuellen Zeile Asien als Teilzei-
chenkette enthält und 0, wenn nicht.
Auswahlbedingungen
Mit den Auswahlbedingungen gibt der Benutzer an, welche Daten aus den
Eingabedateien ausgewählt werden sollen. Eine Auswahlbedingung kann
sein:
- /regulärerausdruck/
- vergleich
- mustervergleich
- bereichsangabe
- zusammengesetzte-auswahlbedingung
/regulärerausdruck/
Regulärer Ausdruck. awk unterstützt erweiterte reguläre Ausdrücke.
Ein regulärer Ausdruck wird in Schrägstriche /.../ eingeschlossen.
Siehe auch expressions(5).
Achtung: Frühere Versionen von awk hatten eine spezielle Syntax für
Wiederholungen (m,n). Bestehende awk-Scripts sollten diesbezüglich
überprüft werden.
Beispiel:
Regulärer Ausdruck, der für Folgen aus a, b oder c steht:
/[abc]+/
Seite 20 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
vergleich
Ein Vergleich ist ein Ausdruck (siehe Ausdrücke oben) mit Ver-
gleichsoperatoren. Die Vergleichsoperatoren und ihre Bedeutung
sind:
a > b a größer als b
a >= b a größer als oder gleich b
a < b a kleiner als b
a <= b a kleiner als oder gleich b
a == b a gleich b
a != b a ungleich b
Die Operanden a und b können beliebige Ausdrücke sein. Wenn beide
Operanden numerisch sind, wird ein numerischer Vergleich durchge-
führt, ansonsten ein alphanumerischer.
mustervergleich
Ein Mustervergleich ist ein Ausdruck (siehe Ausdrücke) mit Muster-
vergleichsoperatoren. Bei einem Mustervergleich wird eine Zeichen-
kette mit einem regulären Ausdruck, genannt Muster, verglichen. Die
Mustervergleichsoperatoren und ihre Bedeutung sind:
zk ~ m Zeichenkette zk paßt zu Muster m
zk !~ m Zeichenkette zk paßt nicht zu Muster m
Mit einem Mustervergleich als Auswahlbedingung können Sie einzelne
Felder auswählen.
Beispiel:
Alle Sätze auswählen, deren erstes Feld mit A oder a beginnt:
$1 ~ /^[Aa]/
Der reguläre Ausdruck ^[Aa] steht für Zeichenketten mit A oder a am
Anfang. Das erste Feld des Satzes ($1) muß zu dem regulären Aus-
druck passen (~), d. h. am Anfang muß ein A oder a stehen.
bereichsangabe
Die Bereichsangabe hat die Form:
/regulärerausdruck/, /regulärerausdruck/
Die Bereichsangabe bedeutet, daß die zugehörige Aktion für alle
Sätze ausgeführt werden soll, die innerhalb des Bereichs liegen.
Anfang und Ende des Bereichs werden durch zwei reguläre Ausdrücke
festgelegt. Der Bereich beginnt mit dem ersten Satz, der eine Zei-
chenkette enthält, die zum ersten regulären Ausdruck paßt. Der
Bereich endet mit dem ersten Satz, der eine Zeichenkette enthält,
die zum zweiten regulären Ausdruck paßt.
Seite 21 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel:
Sie wollen den Bereich von der ersten Zeile, die mit C beginnt, bis
zur ersten Zeile, die mit K beginnt, auswählen und von jeder Zeile
in diesem Bereich das erste Feld ausgeben lassen:
/^C/, /^K/ {print $1}
zusammengesetzte-auswahlbedingung
Mit den logischen Operatoren (siehe Ausdrücke oben) können Auswahl-
bedingungen negiert und mehrere Auswahlbedingungen zu einer Bedin-
gung zusammengesetzt werden. Die logischen Operatoren und ihre
Bedeutung sind:
!aw Negation der Auswahlbedingung aw
aw1 || aw2 Auswahlbedingung aw1 oder aw2. Die Bedingung ist
erfüllt, wenn aw1 oder aw2 wahr (ungleich 0) ergibt.
aw1 && aw2 Auswahlbedingung aw1 und aw2. Die Bedingung ist
erfüllt, wenn aw1 und aw2 wahr (ungleich 0) ergeben.
(aw) Klammern
Die Auswertung einer zusammengesetzten Bedingung erfolgt von links
nach rechts.
Beispiel:
Sie wollen alle Sätze auswählen, die eine gerade Feld-Anzahl haben
und deren erstes Feld mit einem Buchstaben zwischen M (inklusive)
und Q (exklusive) beginnt.
NF%2==0 && $1 >= "M" && $1 < "Q"
Es gibt im allgemeinen mehrere Möglichkeiten, eine Auswahl durch
eine Bedingung zu formulieren. Besteht in der aktuell gültigen Sor-
tierreihenfolge der Bereich [M-Q] genau aus den Großbuchstaben M,
N, O, P, Q, so erhält man dieselbe Auswahl durch folgenden Muster-
vergleich:
NF%2==0 && $1 ~ /^[MNOP]/
Die erste awk-Zeile kann in Abhängigkeit von der Sortierreihenfolge
des aktuellen Zeichensatzes unterschiedliche Ergebnisse liefern.
Die zweite awk-Zeile wählt immer nur die Sätze aus, deren erstes
Feld mit den Buchstaben M, N, O oder P beginnt.
Seite 22 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Aktionen
In den Aktionen geben Sie an, was geschehen soll, wenn die zugehörige
Auswahlbedingung zutrifft. Dies kann z. B. die Bearbeitung einer aus-
gewählten Zeile sein. Die Aktion muß auf derselben Zeile wie die zuge-
hörige Auswahlbedingung beginnen. Ist dies nicht möglich, so ist ein
Neue-Zeile-Zeichen mit \ zu entwerten. Leer- und Tabulatorzeichen zwi-
schen Aktion und Auswahlbedingung werden ignoriert.
Eine Aktion besteht aus einer oder mehreren Anweisungen und muß in
geschweifte Klammern { } eingeschlossen sein:
______________________________________________________________________
{anweisung [;anweisung] ...}
______________________________________________________________________
Anweisung
Eine Anweisung kann sein:
- ausdruck
- ablaufanweisung
ausdruck
Der Ausdruck wird ausgewertet, jedoch nur dann weiter verwertet,
wenn ausdruck eine Zuweisung, ein Inkrement oder ein Dekrement
ist (siehe Ausdrücke oben).
ablaufanweisung
Mit ablaufanweisung können Sie den Ablauf des awk-Programms steu-
ern (siehe ABLAUFANWEISUNGEN unten).
Eine Anweisung kann mehrere Zeilen einnehmen. Dabei muß jede Zeile mit
einem Gegenschrägstrich \ abgeschlossen werden. Hierdurch wird das
Neue-Zeile-Zeichen entwertet.
Mehrere Anweisungen
Mehrere Anweisungen können durch geschweifte Klammern { } zusammenge-
faßt werden. Anweisungen werden voneinander getrennt durch:
- Strichpunkt ;
- geschweifte Klammer zu }
- Neue-Zeile-Zeichen.
ABLAUFANWEISUNGEN
Mit den Ablaufanweisungen können Sie den Ablauf des awk-Programms
steuern. Bei awk gibt es folgende Ablaufanweisungen:
Seite 23 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
______________________________________________________________________
| Ablaufanweisung| Bedeutung |
|________________|____________________________________________________|
| break | Schleife abbrechen |
|________________|____________________________________________________|
| continue | Rest eines Schleifendurchgangs überspringen |
|________________|____________________________________________________|
| exit | awk-Programm beenden |
|________________|____________________________________________________|
| for | Gezählte Wiederholung und Array-Durchlauf |
|________________|____________________________________________________|
| if | Bedingte Anweisung |
|________________|____________________________________________________|
| next | Mit dem nächsten Eingabesatz fortfahren |
|________________|____________________________________________________|
| while | Schleife |
|________________|____________________________________________________|
| do | Schleife |
|________________|____________________________________________________|
| delete array[i]| Element i des Arrays array löschen |
|________________|____________________________________________________|
| return x | Rücksprung aus einer Funktion mit Wertangabe |
|________________|____________________________________________________|
| return | Rücksprung aus einer Funktion ohne Wertangabe |
|________________|____________________________________________________|
Die Ablaufanweisungen sind im folgenden alphabetisch beschrieben.
break - Schleife abbrechen
break kann im Schleifenrumpf einer for-, while- oder do-Schleife ver-
wendet werden. break bewirkt, daß die Schleife beendet wird.
______________________________________________________________________
break
______________________________________________________________________
Beispiel:
Solange ein Satz mit . beginnt, soll der nächste Satz eingelesen wer-
den. Wenn das 2. Feld des eingelesenen Satzes größer als 1000 ist,
soll abgebrochen werden.
{ while($1 ~ /^\./)
{
getline;
if($2 > 1000) break;
}
}
Seite 24 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
continue - Rest eines Schleifendurchlaufs überspringen
continue kann im Schleifenrumpf einer for-, while- oder do-Schleife
verwendet werden. continue bewirkt, daß der aktuelle Schleifendurch-
lauf beendet und mit dem nächsten Durchlauf weitergemacht wird.
______________________________________________________________________
continue
______________________________________________________________________
Beispiel:
Es sollen nur gerade Felder ausgegeben werden:
{
i=1;
while(i++ <= NF)
{
if(i%2) continue;
else print $i
}
}
delete - Ein Element eines Arrays löschen
______________________________________________________________________
delete array[i]
______________________________________________________________________
delete kann dazu verwendet werden, alle Elemente eines Arrays zu
löschen.
Beispiel:
Die folgende Schleife löscht alle Elemente des Arrays max:
for (i in max)
delete max[i]
do - Schleife
Mit der do-Schleife (oder do-while-Schleife) wird eine Anweisung wie-
derholt, solange eine Bedingung erfüllt ist. Im Gegensatz zur while-
Schleife wird die Anweisung auf jeden Fall mindestens einmal ausge-
führt.
______________________________________________________________________
do anweisung while (ausdruck)
______________________________________________________________________
Seite 25 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn
mehrere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
ausdruck
Ausdruck (siehe Ausdrücke oben), der die Bedingung angibt.
Beispiel:
Die Felder eines Satzes sollen einzeln ausgegeben werden:
{ i=0; do {print $(++i)} while (i != NF) }
exit - awk-Programm beenden
Mit exit wird das awk-Programm beendet.
Wenn ein END-Teil vorhanden ist, dann führt awk noch die dort angege-
bene Abschluß-Aktion aus, ansonsten wird das Programm sofort beendet.
______________________________________________________________________
exit
______________________________________________________________________
Beispiel:
Wenn das Zeichen Klammeraffe in der Eingabe erscheint, soll das Ergeb-
nis ausgegeben und die Bearbeitung beendet werden:
...
/@/ {exit}
...
END {print ergebnis}
for - Gezählte Wiederholung
Mit der for-Schleife wird eine Anweisung wiederholt, solange eine
Bedingung erfüllt ist.
______________________________________________________________________
for(ausdruck1; ausdruck2; ausdruck3) anweisung
______________________________________________________________________
ausdruck1
Ausdruck (siehe Ausdrücke oben).
ausdruck1 wird einmal bei Start der for-Anweisung ausgewertet.
Seite 26 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel:
i=1
ausdruck2
Ausdruck (siehe Ausdrücke oben).
ausdruck2 wird vor jedem Schleifendurchgang ausgewertet. anwei-
sung wird nur ausgeführt, falls ausdruck2 ungleich 0 (wahr)
ergibt, ansonsten wird die Wiederholung beendet.
Beispiel:
i<10
ausdruck3
Ausdruck (siehe Ausdrücke oben).
ausdruck3 wird nach jedem Schleifendurchgang ausgewertet.
Beispiel:
i++
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn
mehrere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
Beispiel:
Die Felder des aktuellen Satzes sollen in umgekehrter Reihenfolge
ausgegeben werden.
{for(i=NF; i>0; i--) print $i}
for - Array-Durchlauf
Diese Form der for-Anweisung ist eine awk-Besonderheit zum Durchlaufen
eines Arrays.
______________________________________________________________________
for(index in array) anweisung
______________________________________________________________________
index
Variable (siehe GRUNDELEMENTE DER AWK-SPRACHE oben), die in unbe-
stimmter Reihenfolge alle Elemente des Arrays array durchläuft.
Der Index kann numerisch oder alphanumerisch sein.
Seite 27 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
array
Array, das durchlaufen wird.
anweisung
Anweisung, die für jedes Array-Element ausgeführt wird. Wenn meh-
rere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
Beispiel:
Das Array monate enthält für jeden Monat die Anzahl von Tagen. Ein
Array-Element wird mit dem Monatsnamen indiziert, z. B.
monate["Januar"]=31.
Durch folgendes awk-Programm wird für jeden Monat der Monatsname und
die Anzahl von Tagen ausgegeben.
$ awk ' BEGIN { monate["Januar"]=31;
> monate["Februar"]=28;
> monate["Maerz"]=31;
> monate["April"]=30;
> monate["Mai"]=31;
> monate["Juni"]=30;
> monate["Juli"]=31;
> monate["August"]=31 }
> END { for(i in monate) print "Monat",i,"hat",monate[i],"Tage" } '
Monat Mai hat 31 Tage
Monat August hat 31 Tage
Monat Juli hat 31 Tage
Monat April hat 30 Tage
Monat Juni hat 30 Tage
Monat Januar hat 31 Tage
Monat Maerz hat 31 Tage
Monat Februar hat 28 Tage
if - Bedingte Anweisung
Bei der if-Anweisung wird eine Anweisung abhängig von einer Bedingung
ausgeführt.
______________________________________________________________________
if(ausdruck) anweisung1 [else anweisung2]
______________________________________________________________________
ausdruck
Ausdruck (siehe Ausdrücke oben), der die Bedingung angibt. Wenn
ausdruck ungleich 0 (wahr) ergibt, wird anweisung1 ausgeführt.
Seite 28 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
anweisung1
Anweisung, die ausgeführt wird, falls ausdruck wahr ist. Wenn
mehrere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
anweisung2
Anweisung, die ausgeführt wird, falls ausdruck falsch ist. Wenn
mehrere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
Beispiel:
Wenn Feld 1 größer als 2 ist, dann sollen die Felder 2 und 3 ausgege-
ben werden, ansonsten die Felder 4 und 5:
{ if($1 > 2) print $2, $3; else print $4, $5 }
next - Mit dem nächsten Eingabesatz fortfahren
awk unterbricht die Bearbeitung des aktuellen Satzes; die Anweisungen,
die next folgen, werden nicht ausgeführt. Dann liest awk den nächsten
Eingabesatz ein. NR, NF, FNR, $0 und $1 bis $NF werden neu gesetzt.
Unterschied zur getline-Funktion:
getline macht den nächsten Satz zum aktuellen Satz; die Anweisungen,
die getline folgen, werden mit den Werten des nächsten Satzes für die
$-Variablen und für NR, NF und FNR ausgeführt.
______________________________________________________________________
next
______________________________________________________________________
Beispiel:
Sätze, die mit . beginnen, sollen ignoriert werden:
{ if ($1 ~/^\./) next }
return - Rücksprung aus einer Funktion
Der Rumpf einer Funktionsdefinition kann eine return-Anweisung enthal-
ten, die die Kontrolle und eventuell einen Wert an den Aufrufer
zurückliefert.
______________________________________________________________________
return [ausdruck]
______________________________________________________________________
Seite 29 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel:
Die folgende Funktion berechnet das Maximum der Argumente:
function max(m, n) {
return m > n ? m : n
}
Die Variablen m und n gehören zur Funktion max; sie stehen in
keiner Beziehung zu irgendwelchen Variablen gleichen Namens
irgendwo anders im Program.
while - Schleife
Mit der while-Schleife wird eine Anweisung wiederholt, solange eine
Bedingung erfüllt ist.
______________________________________________________________________
while(ausdruck) anweisung
______________________________________________________________________
ausdruck
Ausdruck (siehe Ausdrücke oben), der die Bedingung angibt.
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn
mehrere Anweisungen ausgeführt werden sollen, müssen sie mit
geschweiften Klammern { } zusammengefaßt werden.
Beispiel:
Alle Eingabefelder werden ausgegeben; jedes Feld wird in eine eigene
Ausgabezeile geschrieben:
{ i = 1;
while (i <= NF) {
print $i
i++
}
}
Seite 30 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
FUNKTIONEN
awk stellt eine Reihe vordefinierter Funktionen zur Verfügung, bietet
aber auch die Möglichkeit, eigene Funktionen zu definieren:
______________________________________________________________________
function name(arg, ...) {anweisungen}
______________________________________________________________________
Vor {anweisungen} darf ein Neue-Zeile-Zeichen stehen. Leerzeilen
innerhalb der geschweiften Klammern { } sind ebenfalls erlaubt. Eine
Funktionsdefinition steht im Hauptteil eines awk-Programms gleichbe-
rechtigt neben auswahlbedingung {aktion}.
Funktionsaufrufe dürfen innerhalb eines Aktionsteils an beliebiger
Stelle in einem Ausdruck stehen, nicht jedoch vor der Funktionsdefini-
tion. Beim Aufruf darf zwischen dem Funktionsnamen und der öffnenden
runden Klammer kein Leerzeichen stehen.
Funktionsaufrufe können geschachtelt werden, Funktionen dürfen rekur-
siv aufgerufen werden.
Bei den meisten Funktionen müssen Sie die Argumente nicht in Klammern
einschließen. Klammern sind aber empfehlenswert, weil sie die Lesbar-
keit verbessern. Übergeben Sie ein Array als Argument, dann wird ein
Verweis auf das Array übergeben (call by reference) - Sie können aus
der Funktion die Elemente des Arrays verändern. Bei skalaren Argumen-
ten wird zur Übergabe der Wert der Variable kopiert (call by value) -
Sie können den Wert der Variablen aus der Funktion heraus nicht
ändern. Argumente haben einen lokal auf die Funktion beschränkten Gel-
tungsbereich, während alle anderen Variablen immer einen globalen
haben. Benötigen Sie lokale Variablen in einer Funktion, dann definie-
ren Sie diese am Ende der Argumentliste in der Funktionsdefinition.
Jede Variable der Argumentliste, für die kein aktuelles Argument exi-
stiert, ist eine lokale Variable, die mit dem Wert 0 vorbelegt ist.
Wie in C kann es Funktionen geben, die ein Ergebnis liefern (z. B.
exp) und solche mit prozeduralem Charakter (z. B. Ausgabefunktionen).
Die Anweisung return kann mit oder ohne Wertangabe benutzt werden,
oder ganz wegfallen - dann ist der Rückgabewert undefiniert, falls
darauf zugegriffen werden sollte.
Beispiel:
Die Funktion suche sucht in dem Array allenamen nach der Zeichenkette
wer und gibt den Index oder -1 zurück. Dabei wird das 3. Argument lauf
als lokale Variable verwendet.
Seite 31 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
...
{ print $1, suche($1, allenamen) }
...
function suche(wer, allenamen, lauf)
{
for (lauf=0; allenamen[lauf]; lauf++)
if (index(allenamen[lauf], wer) == 1
&& length(allenamen[lauf]) == length(wer))
return lauf
return -1
}
Vordefinierte Funktionen
_________________________________________________________________________
| Funktion | Bedeutung |
|________________________________________________________________________|
| Eingabefunktion |
|___________________________|____________________________________________|
| getline | Satz einlesen |
|________________________________________________________________________|
| Ausgabefunktionen |
|___________________________|____________________________________________|
| print([arg,...]) | Standardausgabefunktion |
|___________________________|____________________________________________|
| printf(format [arg,...]) | Formatierte Ausgabe |
|________________________________________________________________________|
| Arithmetische Funktionen |
|___________________________|____________________________________________|
| atan2(y,x) | Arcustangens von y/x |
|___________________________|____________________________________________|
| cos(x) | Cosinus |
|___________________________|____________________________________________|
| exp(x) | Exponentialfunktion |
|___________________________|____________________________________________|
| int(x) | Ganzzahliger Anteil |
|___________________________|____________________________________________|
| log(x) | Natürlicher Logarithmus |
|___________________________|____________________________________________|
| rand() | Liefert eine Zufallszahl |
|___________________________|____________________________________________|
| sin(x) | Sinus |
|___________________________|____________________________________________|
| sqrt(x) | Quadratwurzel |
|___________________________|____________________________________________|
| srand([x]) | Setzt den Anfangs-Berechnungswert für |
| | rand() |
|___________________________|____________________________________________|
Seite 32 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
_________________________________________________________________________
| Zeichenketten-Funktionen |
|___________________________|____________________________________________|
| gsub(re,repl[,in]) | Globale Substitutionsfunktion |
|___________________________|____________________________________________|
| index(zk1,zk2) | Erstes Vorkommen einer Teilzeichenkette |
|___________________________|____________________________________________|
| length([zk]) | Länge einer Zeichenkette |
|___________________________|____________________________________________|
| match(zk,re) | Prüft, ob zk zum regulären Ausdruck re |
| | paßt |
|___________________________|____________________________________________|
| split(zk,array,[sep]) | Aufteilen einer Zeichenkette |
|___________________________|____________________________________________|
| sprintf(format,e1,e2,...) | Formierte Ausgabe in eine Variable |
|___________________________|____________________________________________|
| sub(re, repl[,in]) | Substitutionsfunktion |
|___________________________|____________________________________________|
| substr(zk,m,[n]) | Teilzeichenkette bestimmen |
|___________________________|____________________________________________|
| tolower(zk) | Konvertierung in Kleinbuchstaben |
|___________________________|____________________________________________|
| toupper(zk) | Konvertierung in Großbuchstaben |
|________________________________________________________________________|
| Allgemeine Funktionen |
|___________________________|____________________________________________|
| close(expr) | Datei oder Pipe schließen |
|___________________________|____________________________________________|
| system(expr) | Shell-Kommando aufrufen |
|___________________________|____________________________________________|
Die Funktionen sind im folgenden alphabetisch beschrieben. Bei jeder
Funktion ist angegeben, welche Argumente Sie angeben können: Sie kön-
nen als Argument eine Konstante angeben oder einen Ausdruck (siehe
Ausdrücke oben). awk wertet die Argument-Ausdrücke zuerst aus und wen-
det dann die Funktion auf die berechneten Ergebnisse an.
atan2 - Arcustangens
atan2 berechnet den Arcustangens des Quotienten zweier Zahlen:
atan2(y,x) liefert den Arcustangens von y/x.
______________________________________________________________________
atan2(y,x)
______________________________________________________________________
y,x Zahlen, für deren Quotient der Arcustangens berechnet werden
soll.
Seite 33 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
close - Datei oder Pipe schließen
close schließt die angegebene Datei bzw. Pipe.
______________________________________________________________________
close(expr)
______________________________________________________________________
expr Name der Datei oder der Pipe, die geschlossen werden soll (siehe
bei der Beschreibung der Funktionen print und printf weiter unten
die Erläuterungen zur Ausgabeumlenkung).
cos - Cosinus
cos berechnet den Cosinus einer Zahl.
______________________________________________________________________
cos(x)
______________________________________________________________________
x Zahl, für die der Cosinus berechnet werden soll.
exp - Exponentialfunktion
exp berechnet e hoch x.
______________________________________________________________________
exp(x)
______________________________________________________________________
x Zahl, für die e hoch x berechnet werden soll.
getline - Einen Satz einlesen
awk liest einen Satz ein (siehe next).
getline hat mehrere Formate. Die Formate von getline haben folgende
Rückgabewerte:
1 bei fehlerfreiem Lesevorgang
0 bei Dateiende
-1 bei einem Fehler
______________________________________________________________________
getline
______________________________________________________________________
Seite 34 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
awk liest in $0 den nächsten Eingabesatz aus der Eingabedatei ein. NR,
NF, FNR, $0 und $1 bis $NF werden neu gesetzt.
Beispiel:
Wenn ein Satz %%% enthält, wird der nächste Satz eingelesen, d. h.
Eingabesätze, die %%% enthalten, werden ignoriert.
/%%%/ {getline}
______________________________________________________________________
getline < datei
______________________________________________________________________
awk liest in $0 einen Satz aus der Datei datei ein. NF, $0 und $1 bis
$NF werden neu gesetzt.
datei
Name der Datei, aus der gelesen werden soll.
______________________________________________________________________
getline var
______________________________________________________________________
awk liest in die Variable var den nächsten Eingabesatz aus der Einga-
bedatei ein. NR und FNR werden neu gesetzt.
var Variable, in die der nächste Satz eingelesen werden soll.
______________________________________________________________________
getline var < datei
______________________________________________________________________
awk liest in die Variable var einen Satz aus der Datei datei ein. NR,
NF, FNR, $0 und $1 bis $NF werden nicht verändert.
var Variable, in die der Satz eingelesen werden soll.
datei
Name der Datei, aus der gelesen werden soll.
______________________________________________________________________
kommando | getline [var]
______________________________________________________________________
Die Ausgabe des Kommandos kommando wird nach getline umgelenkt. Mit
jedem getline-Aufruf in diesem Format liest awk in $0 bzw. var jeweils
die nächste Zeile aus der Ausgabe von kommando ein.
Seite 35 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Ist var angegeben, werden NR, NF, FNR, $0 und $1 bis $NF nicht verän-
dert. Ist var nicht angegeben, werden NF, $0 und $1 bis $NF neu
gesetzt.
Dieses Konstrukt wirkt wie der Aufruf der C-Funktion popen(3S) mit
Modus r.
var Variable, in die der Satz eingelesen werden soll.
var nicht angegeben:
Der Satz wird in $0 eingelesen.
kommando
Name des Kommandos, aus dessen Ausgabe gelesen werden soll.
gsub - Globale Substitutionsfunktion
gsub ersetzt alle Zeichenketten in $0 bzw. in in, die zu dem erweiter-
ten regulären Ausdruck re passen, durch die Zeichenkette repl.
gsub liefert die Anzahl der Ersetzungen zurück.
______________________________________________________________________
gsub(re,repl[,in])
______________________________________________________________________
re Erweiterter regulärer Ausdruck, der als Muster für die Ersetzung
dienen soll.
repl Zeichenkette, die die zu re passenden Zeichenketten ersetzen
soll.
in Zeichenkette, in der die Ersetzung stattfinden soll.
in nicht angegeben:
Die Zeichenketten werden in $0 ersetzt.
index - Teilzeichenkette suchen
index sucht eine Teilzeichenkette in einer Zeichenkette. Wenn die
Teilzeichenkette vorkommt, gibt index die Anfangsposition (in Zeichen,
numeriert ab 1) des ersten Vorkommens zurück. Wenn die Teilzeichen-
kette nicht vorkommt, gibt index 0 zurück.
______________________________________________________________________
index(zk1,zk2)
______________________________________________________________________
Seite 36 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
zk1 Zeichenkette, in der index die Teilzeichenkette sucht.
zk2 Teilzeichenkette, die index sucht.
Beispiel:
index("ToTo-LoTo","To")
ist 1.
int - Ganzzahliger Anteil
int gibt die größte ganze Zahl zurück, die kleiner oder gleich dem
Argument ist.
______________________________________________________________________
int(x)
______________________________________________________________________
x Zahl, deren ganzzahliger Anteil bestimmt werden soll.
length - Länge bestimmen
length bestimmt die Länge einer Zeichenkette.
______________________________________________________________________
length[(zk)]
______________________________________________________________________
zk length bestimmt die Länge der Zeichenkette zk.
zk nicht angegeben:
length bestimmt die Länge des aktuellen Eingabesatzes $0.
log - Logarithmus
log berechnet den natürlichen Logarithmus zur Basis e.
______________________________________________________________________
log(x)
______________________________________________________________________
x Zahl, für die der natürliche Logarithmus berechnet werden soll.
Seite 37 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
match - Prüffunktion für reguläre Ausdrücke
match prüft, ob eine Zeichenkette in zk zu dem erweiterten regulären
Ausdruck re paßt.
match liefert die Stelle in zk (in Zeichen, numeriert ab 1) zurück, an
der die zu re passende Zeichenkette anfängt; wenn keine Zeichenkette
in zk paßt, liefert match 0 zurück.
Die Variable RSTART wird auf den Return-Wert von match gesetzt. Die
Variable RLENGTH wird auf die Länge der passenden Zeichenkette gesetzt
bzw. auf -1, falls keine Zeichenkette paßt.
______________________________________________________________________
match(zk,re)
______________________________________________________________________
zk Zeichenkette, in der die Mustersuche stattfinden soll.
re Erweiterter regulärer Ausdruck.
print - Standardausgabefunktion
print ist die Standardausgabefunktion. print gibt entweder den aktuel-
len Satz oder die angegebenen Argumente aus und schließt die Ausgabe
mit dem Ausgabesatztrenner ORS (ORS - Output Record Separator) ab.
Nähere Beschreibung des Ausgabeformats siehe Ausgabeformat unten.
______________________________________________________________________
print(arg1[[,]arg2]...)[umlenkung]
______________________________________________________________________
Kein Argument angegeben:
print gibt den aktuellen Eingabesatz auf die Standardausgabe aus.
arg1arg2
Argumente, die ausgegeben werden sollen. print wertet die
Argument-Ausdrücke aus und hängt die Ergebnisse in der Reihen-
folge der Argumente hintereinander.
arg1,arg2
Argumente, die ausgegeben werden sollen. print gibt die ausgewer-
teten Argument-Ausdrücke in der angegebenen Reihenfolge aus und
trennt sie durch den Ausgabe-Feldtrenner OFS (OFS - Output Field
Separator), sofern sie durch Kommata getrennt in der print-Anwei-
sung stehen.
Seite 38 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
umlenkung
Sie können die Ausgabe in eine Datei umlenken oder an ein Pro-
gramm weiterreichen. Maximal können Sie 10 Ausgabedateien verwen-
den.
umlenkung kann sein: >, >>, Programmname.
>datei
Die Ausgabe wird in die Datei datei geschrieben. Der alte
Inhalt von datei wird beim ersten print-Aufruf gelöscht.
Alle weiteren print- oder printf-Ausgaben auf datei in dem-
selben awk-Programm werden angehängt. datei bleibt bis zum
Ende des awk-Programms geöffnet, falls sie nicht explizit
geschlossen wird.
>>datei
Die Ausgabe wird an den bisherigen Inhalt der Datei datei
angehängt. datei bleibt bis zum Ende des awk-Programms
geöffnet, falls sie nicht explizit geschlossen wird.
|prog
Die Ausgabe wird über eine Pipe an das Programm prog
geschickt. Sie dürfen innerhalb eines awk-Programms nur eine
Pipe zu prog öffnen. Auf diese Pipe können mehrere print-
oder printf-Ausgaben erfolgen.
Dieses Konstrukt wirkt wie der Aufruf der C-Funktion
popen(3S) mit Modus w.
Die Pipe bleibt bis zum Ende des awk-Programms geöffnet,
falls sie nicht explizit geschlossen wird.
Den Dateinamen bzw. Programmnamen können Sie direkt angeben, ein-
geschlossen in "...", oder durch eine Variable, die den Dateina-
men enthält.
Vorsicht:
Wenn Sie auf die Eingabedatei umlenken, wird die Eingabedatei
ohne Warnung zerstört!
Ausgabeformat
print gibt ganze Zahlen dezimal aus und Zeichenketten in ihrer vollen
Länge. Ansonsten ist das Ausgabeformat durch folgende vordefinierte
Variablen festgelegt:
OFS - Ausgabe-Feldtrenner
OFS ist standardmäßig ein Leerzeichen. Sie können OFS ein belie-
biges Zeichen zuweisen und damit den Ausgabe-Feldtrenner ändern.
Seite 39 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
ORS - Ausgabe-Satztrenner
ORS ist standardmäßig das Neue-Zeile-Zeichen. Sie können ORS ein
beliebiges Zeichen zuweisen und damit den Ausgabe-Satztrenner
ändern.
OFMT - Gleitkomma-Ausgabeformat
(OFMT - Output Format) OFMT enthält das Ausgabeformat für Gleit-
kommawerte. OFMT ist standardmäßig %.6g. Das bedeutet, daß Gleit-
kommazahlen mit maximal 6 Stellen hinter dem Dezimalpunkt ausge-
geben werden. Sie können OFMT ein anderes printf-Format für
Gleitkommazahlen zuweisen (siehe printf unten).
Beispiel 1
Erstes und zweites Feld, getrennt durch Leerzeichen, ausgeben:
{print $1,$2}
Beispiel 2
Erstes und zweites Feld ohne Ausgabe-Feldtrenner aneinanderhängen:
{print $1$2} oder {print $1 $2}
printf - Formatierte Ausgabe
printf ist die Ausgabefunktion für formatierte Ausgabe. Sie können das
Ausgabeformat wie bei der Standard-C-Funktion printf(3S) angeben.
______________________________________________________________________
printf(format,arg,...)[umlenkung]
______________________________________________________________________
format
Zeichenkette, die das Ausgabeformat enthält. Das Ausgabeformat
besteht aus Zeichen und Formatangaben. Die darstellbaren Zeichen
werden unverändert ausgegeben. Die im Abschnitt Grundelemente
angegebenen Sonderzeichen werden gleich umgesetzt. So wird z. B.
durch \n auf den Anfang der nächsten Zeile positioniert.
Eine Formatangabe wird mit dem Prozent-Zeichen % eingeleitet. Die
Angabe einer zahl nach dem Prozent-Zeichen legt die Anzahl der
Stellen fest. Die wichtigsten Formatelemente sind in der folgen-
den Tabelle zusammengestellt.
Seite 40 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
_______________________________________________________________
| Formatelement| Bedeutung |
|______________|_______________________________________________|
| %c | Einzelnes Zeichen |
|______________|_______________________________________________|
| %d, %i | Ganzzahl dezimal |
|______________|_______________________________________________|
| %e, %E | Gleitkommazahl in Exponent-Darstellung, z. B.|
| | 5.234e+2 |
|______________|_______________________________________________|
| %f | Gleitkommazahl, z. B. 52.34 |
|______________|_______________________________________________|
| %g, %G | %e oder %f, je nachdem, welche Darstellung |
| | kürzer ist |
|______________|_______________________________________________|
| %o | Ganzzahl oktal (Basis 8) |
|______________|_______________________________________________|
| %s | Zeichenkette |
|______________|_______________________________________________|
| %u | Ganzzahl dezimal ohne Vorzeichen |
|______________|_______________________________________________|
| %x, %X | Ganzzahl hexadezimal (Basis 16) |
|______________|_______________________________________________|
arg Argumente, die ausgegeben werden sollen. printf wertet die
Argument-Ausdrücke aus, ordnet sie den Formatangaben in format in
der angegebenen Reihenfolge zu und gibt sie entsprechend forma-
tiert aus.
- Wenn Formatangabe und Argument nicht zusammenpassen (Formatan-
gabe numerisch, Argument alphanumerisch), wird 0 ausgegeben.
- Wenn mehr Argumente vorhanden sind als Formatangaben, werden
die überzähligen Argumente ignoriert, d. h. nicht ausgegeben.
- Wenn mehr Formatangaben vorhanden sind als Argumente, wird
eine Fehlermeldung ausgegeben.
umlenkung
Bezüglich Umlenkung gilt dasselbe wie bei print.
umlenkung nicht angegeben:
printf gibt auf die Standardausgabe aus.
Beispiel:
Feld 1 wird als Dezimalzahl mit mindestens 2 Stellen ausgegeben,
danach, getrennt durch **, Feld 2 als Zeichenkette mit mindestens 5
Zeichen und danach Neue Zeile:
{ printf("%2d**%5s\n", $1,$2) }
Seite 41 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
rand - Zufallszahl liefern
rand liefert eine Zufallszahl r zurück, für die gilt: 0 <= r < 1.
______________________________________________________________________
rand
______________________________________________________________________
Siehe auch srand.
sin - Sinus
sin liefert den Sinus einer Zahl.
______________________________________________________________________
sin(x)
______________________________________________________________________
x Zahl, deren Sinus berechnet werden soll.
sprintf - Formatierte Ausgabe in Zeichenkette
Bei sprintf ist die Formatierung wie bei printf. Es erfolgt aber keine
Ausgabe. Statt dessen gibt sprintf die formatierte Ausgabe als
Ergebnis-Zeichenkette zurück. Diese Zeichenkette können Sie z. B.
einer Variablen zuweisen.
______________________________________________________________________
sprintf(format,arg,...)
______________________________________________________________________
format
Zeichenkette, die das Ausgabeformat enthält (siehe printf).
arg Argumente, die ausgegeben werden sollen (siehe printf).
Beispiel:
Das folgende awk-Programmstück erzeugt dieselbe Ausgabe wie das Bei-
spiel bei printf.
{ x = sprintf("%2d**%5s\n", $1,$2); print x }
Seite 42 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
split - Zeichenkette aufteilen
split teilt eine Zeichenkette in Teilzeichenketten auf und speichert
die Teilzeichenkette als Elemente eines Arrays ab. Die Array-Elemente
werden beginnend mit 1 aufsteigend indiziert.
split liefert die Anzahl der Elemente des Arrays zurück.
______________________________________________________________________
split(zk,array[,sep])
______________________________________________________________________
zk Zeichenkette, die aufgeteilt werden soll.
array
Name des Ergebnis-Arrays.
sep Erweiterter regulärer Ausdruck, der die Zeichen bestimmt, die in
zk als Trennzeichen zwischen den Teilzeichenketten gelten sollen.
sep nicht angegeben:
FS gilt als Trennzeichen.
Beispiel:
{
s=split("januar:februar:maerz", monate, ":");
for(i=1; i<=s; i++) print monate[i];
}
erzeugt die Ausgabe:
januar
februar
maerz
sqrt - Quadratwurzel berechnen
sqrt berechnet die Quadratwurzel zu einer Zahl.
______________________________________________________________________
sqrt(x)
______________________________________________________________________
x Zahl, deren Quadratwurzel berechnet werden soll.
Seite 43 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
srand - Anfangs-Berechnungswert für die Funktion rand setzen
srand setzt den Anfangs-Berechnungswert für die Funktion rand auf die
Zahl x bzw. auf die aktuelle Uhrzeit, falls kein Argument angegeben
ist.
______________________________________________________________________
srand([x])
______________________________________________________________________
x Zahl, die als Anfangs-Berechnungswert für rand dienen soll.
sub - Substitutionsfunktion
sub ersetzt die erste Zeichenkette in $0 bzw. in in, die zu dem erwei-
terten regulären Ausdruck re paßt, durch die Zeichenkette repl.
sub liefert die Anzahl der Ersetzungen zurück.
______________________________________________________________________
sub(re,repl[,in])
______________________________________________________________________
re Erweiterter regulärer Ausdruck, der als Muster für die Ersetzung
dienen soll.
repl Zeichenkette, die die zu re passenden Zeichenketten ersetzen
soll.
in Zeichenkette, in der die Ersetzung stattfinden soll.
in nicht angegeben:
Die Zeichenketten werden in $0 ersetzt.
substr - Teilzeichenkette bestimmen
substr liefert eine Teilzeichenkette einer Zeichenkette.
______________________________________________________________________
substr(zk,m[,n])
______________________________________________________________________
zk Zeichenkette, aus der eine Teilzeichenkette ausgewählt werden soll.
m Position in zk, bei der die Teilzeichenkette beginnt. Die Zei-
chenpositionen werden beginnend mit 1 von links nach rechts auf-
steigend durchnumeriert.
Seite 44 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
n Maximale Länge der Teilzeichenkette.
n nicht angegeben:
Die Teilzeichenkette geht bis zum Ende von zk.
Beispiel:
{
x = substr("060789",3,2); print "Monat = "x
}
erzeugt die Ausgabe:
Monat = 07
system - Shell-Kommando ausführen
system führt das angegebene Shell-Kommando aus und liefert den Ende-
status des Kommandos zurück.
______________________________________________________________________
system(kommando)
______________________________________________________________________
kommando
Name des Shell-Kommandos, das ausgeführt werden soll.
tolower - In Kleinbuchstaben konvertieren
tolower wandelt alle Großbuchstaben einer Zeichenkette in Kleinbuch-
staben um.
______________________________________________________________________
tolower(zk)
______________________________________________________________________
zk Zeichenkette, die in Kleinbuchstaben konvertiert werden soll
Seite 45 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
toupper - In Großbuchstaben konvertieren
toupper wandelt alle Kleinbuchstaben einer Zeichenkette in Großbuch-
staben um.
______________________________________________________________________
toupper(zk)
______________________________________________________________________
zk Zeichenkette, die in Großbuchstaben konvertiert werden soll.
FEHLERMELDUNGEN
Wenn das awk-Programm fehlerhaft ist, gibt awk Fehlermeldungen aus und
beendet sich sofort. Die Fehlermeldungen enthalten die Fehlerursache,
falls awk diese erkennt, sowie die Zeile des awk-Programms, in der awk
den Fehler vermutet.
Typische Fehlermeldungen sind:
awk: syntax error at source line xxx
In der Zeile xxx des awk-Programms liegt ein Syntaxfehler vor.
awk: illegal statement source line number xxx
In der Zeile xxx des awk-Programms steht eine falsche Anweisung.
INTERNATIONALE UMGEBUNG
Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
texte.
In geklammerten regulären Ausdrücken bestimmt die Umgebungsvariable
LCCOLLATE die Bedeutung von Zeichenbereichen, Äquivalenzklassen und
Zeicheneinheiten, die Umgebungsvariable LCCTYPE die Bedeutung von
Zeichenklassen. LCCOLLATE bestimmt das Verhalten von Vergleichsopera-
toren beim Vergleich von Zeichenketten. LCTYPE bestimmt das Verhalten
der toupper/tolower-Konvertierungen.
LCNUMERIC bestimmt die Darstellung von Dezimalpunkt, Exponentzeichen
und Tausendertrennzeichen bei Ausgaben und internen Konvertierungen,
nicht jedoch in Wertangaben innerhalb eines awk-Programms oder bei
Variablenzuweisung in Argumenten.
Wenn LCMESSAGES, LCCOLLATE, LCCTYPE oder LCNUMERIC nicht oder als
leere Zeichenkette definiert ist, wird der Wert von LANG als Standard-
wert für die jeweils nicht gesetzte oder leere Variable herangezogen.
Ist auch LANG nicht oder als leere Zeichenkette definiert, verhält
sich das System so, als wäre es nicht internationalisiert.
Seite 46 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Hat eine der Variablen für die internationale Umgebung einen ungülti-
gen Wert, verhält sich das System so, als wäre keine Variable gesetzt.
Die Umgebungsvariable LCALL bestimmt die gesamte internationale Umge-
bung. LCALL hat Vorrang vor allen anderen Umgebungsvariablen im
Bereich der Internationalisierung.
BEISPIELE
Beispiel 1
Sie wollen alle Eingabezeilen ausgeben, bei denen Feld 3 größer ist
als Feld 5:
$ awk '$3 > $5' datei
Da keine Aktion angegeben ist, gibt awk standardmäßig die ausgewählten
Zeilen aus.
Beispiel 2
Sie wollen jede 10. Zeile der Datei datei ausgeben:
$ awk '(NR % 10) == 0' datei
Beispiel 3
Sie wollen für jede Zeile das vorletzte und letzte Feld, getrennt
durch Doppelpunkt, ausgeben:
$ awk 'BEGIN {OFS=":"}
> {print $(NF-1), $NF}' datei
Bei Zeilen, die aus einem einzigen Feld bestehen, wird die ganze Zeile
zweimal, getrennt durch Doppelpunkt, ausgegeben (zuerst $0, dann $1).
Beispiel 4
Sie wollen die Werte des ersten Feldes von allen Zeilen addieren. Zum
Schluß sollen Summe und Mittelwert ausgegeben werden.
$ awk '{s += $1}
> END {print "Summe: ", s, "Mittelwert: ", s/NR}'
> datei
Beispiel 5
Präprozessor-if-Anweisung heraussuchen, d. h. einen Bereich auswählen,
dessen erste Zeile mit #if und dessen letzte Zeile mit #endif beginnt:
$ awk '/^#if/, /^#endif/' datei
Seite 47 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel 6
Sie wollen alle Zeilen ausgeben, deren erstes Feld sich von dem ersten
Feld der vorhergehenden Zeile unterscheidet:
$ awk '$1 != vorher { print; vorher = $1 }' datei
Beispiel 7
datei enthält eine Tabelle mit Daten über Jugendliche. In dem zweiten
Feld steht entweder Schueler, Student, Lehrling oder Sonstige. Für
eine Statistik sollen Schüler und Studenten gezählt werden:
$ awk '$2 ~ /Schueler/ {haeuf["Schueler"]++}
> $2 ~ /Student/ {haeuf["Student"]++}
> END {print "Schueler:" haeuf["Schueler"];
> print "Student:" haeuf["Student"]} ' datei
Beispiel 8
In der Datei inhalt steht ein mit Dezimalklassifikation gegliedertes
Inhaltsverzeichnis eines Textes. Die Liste hat folgendes Format:
1. Vorwort
2. Einleitung
3. Das Schachspiel
3.1. Geschichte
3.2. Regeln
3.2.1 Aufstellen der Figuren
.
.
.
4. Das Damespiel
4.1. Geschichte
.
.
.
8. Register
Mit folgendem awk-Programm bringen Sie diese Liste in ein übersichtli-
cheres Format.
$ awk '{$1=$1" ";
> $1=substr($1,1,6);
> print $0}' inhalt >> inh.form
Die Aufbereitung der Ausgabezeilen erfolgt in folgenden Schritten:
Zuerst werden an das erste Feld sechs Leerzeichen angehängt
($1=$1"<blank><blank><blank><blank><blank><blank>"). Dann wird das
erste Feld auf Länge sechs gekürzt. Damit ist in jeder Zeile das erste
Feld 6 Zeichen lang und Feld 2 beginnt immer auf Spalte sieben. Sie
erhalten folgende Ausgabe in der Datei inh.form:
Seite 48 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
1. Vorwort
2. Einleitung
3. Das Schachspiel
3.1. Geschichte
3.2. Regeln
3.2.1 Aufstellen der Figuren
.
.
.
4. Das Damespiel
4.1. Geschichte
.
.
.
8. Register
Beispiel 9
Das folgende awk-Programm in der Datei prog gibt für jeden Satz die
Feldanzahl und die Felder aus. Der Satztrenner wird auf das Dollarzei-
chen $ umdefiniert. Feldtrenner sind daher Leer-, Tabulator- und
Neue-Zeile-Zeichen:
BEGIN { RS="$"; printf "Satz Anz" }
{ printf ("\n%4d %3d ", NR, NF);
for(i=1;i<=NF; i++) printf "%s:", $i }
END {print"\n"}
Die Datei text enthält folgenden Text:
erster Satz$ zweiter Satz $
$
vierter und letzter
Satz$
Der Aufruf:
$ awk -f prog text
liefert:
Satz Anz
1 2 erster:Satz:
2 2 zweiter:Satz:
3 0
4 4 vierter:und:letzter:Satz:
5 0
Seite 49 Reliant UNIX 5.44 Gedruckt 11/98
awk(1) awk(1)
Beispiel 10
Sie ändern die Datei text wie folgt:
&&
erster&&Satz$zweiter Satz$$vierter
und&
letzter
Satz&
und rufen awk auf, dieses Mal mit der Option -F, um den Feldtrenner
auf & zu ändern.
$ awk -F"&" -f prog text
Die Ausgabe ergibt:
Satz Anz
1 6 :::erster::Satz:
2 1 zweiter Satz:
3 0
4 8 vierter:und::letzter::Satz:::
Dieses Beispiel verdeutlicht die Feldeinteilung bei einem Nicht-
Standard-Feldtrenner. Die erste Zeile (&&) der Datei Text ist Teil des
ersten Satzes und ergibt z. B. 3 Felder, weil bei einer Folge von
Trennern jeder Trenner zählt und Neue Zeile implizit auch als Trenner
gilt (2 & + 1 Neue Zeile = 3).
SIEHE AUCH
egrep(1), fgrep(1), grep(1), lex(1), sed(1), expressions(5).
Kernighan, B. W.; Pike, R.: The UNIX Programming Environment.
Tare, R. S.: UNIX Utilities.
Bach, F. et al.: UNIX: Handbuch zur Programmentwicklung.
Aho, A.; Kernighan, B. W.; Weinberger, P.: The AWK Programming Language.
Seite 50 Reliant UNIX 5.44 Gedruckt 11/98