Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

awk - Programmierbare Bearbeitung von Textdateien

&pagelevel(4)&pagelevel

(pattern scanning and processing language)


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

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 angesprochen werden können.

  • Eine Auswahlbedingung kann eine aus erweiterten regulären Ausdrücken 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:

Syntax


Format 1: awk[ -F ERE]
   [ -v initialisierung]... prog[ initialisierung]...[ datei]...
Format 2: awk[ -F ERE]
   [ -f progdat][ -v initialisierung]...[ initialisierung]...[ datei]

-F ERE

Trennzeichen zwischen den Feldern eines Eingabesatzes festlegen.

ERE

Erweiterter regulärer Ausdruck zur Bestimmung des Trennzeichens zwischen den Feldern eines Eingabesatzes. Das Trennzeichen gehört nicht zu einem Feld.


Wenn Sie als Trennzeichen zwischen den Feldern eines Eingabesatzes das Zeichen t verwenden wollen, so müssen Sie es beim awk-Aufruf oder im BEGIN-Teil des awk-Programms folgendermaßen angeben:
awk -F"[t]"... oder BEGIN {FS="t"...}


-F ERE 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 Umgebungsvariable in der Shell.

Die Wertzuweisung über -v initialisierung ist identisch mit der Wertzuweisung über initialisierung (siehe dort).


prog

Angabe des awk-Programms.

prog kann sein:

’awk_programm’; ein awk-Programm in der Kommandozeile

-f progdat; der Name einer Datei, die ein awk-Programm enthält.

’awk_programm’

Ein awk-Programm in der Kommandozeile.
Sie sollten das awk-Programm immer in Hochkommata '...' einschließ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.

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.

initialisierung

Wertzuweisung der Form: var=wert

awk initialisiert die Variable var (egal, ob diese im awk-Programm vorkommt oder nicht) mit wert. initialisierung und datei können in beliebiger Reihenfolge angegeben werden. Die Wertzuweisung erfolgt zu dem Zeitpunkt, zu dem normalerweise die an der Position stehende Datei geöffnet worden wäre.
Zuweisungen vor dem ersten Dateinamen werden nach dem BEGIN-Teil des awk-Programms (wenn vorhanden) ausgeführt; Zuweisungen nach dem letzten Dateinamen werden vor dem END-Teil des awk-Programms (wenn vorhanden) ausgeführt.

Ausnahme

Die $-Variablen (siehe Grundelemente) können 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 Umgebungsvariable in der Shell.

datei

Name der Textdatei, die bearbeitet werden soll. Sie können mehrere 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 Standard-Eingabe.

datei nicht angegeben:
awk liest von der Standard-Eingabe. awk liest die Eingabe satzweise ein, bearbeitet sie und gibt nach jeder Zeile das Ergebnis für diesen Satz aus. Terminalabhängig beenden Sie die Eingabe mit CTRL+D oder @@d.


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.

Beispiel

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 Beispiel die Stückzahl eines Artikels enthält. Wenn die Stückzahl größer als 100 ist, ist die Bedingung erfüllt und die Funktion print wird ausgeführt. Da für print keine Argumente angegeben sind, gibt print die ganze Zeile aus.


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:

$1Artikelbezeichnung (erstes Feld)
\tTabulatorzeichen
$2*$3Stü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.


Struktur eines awk-Programms

Ein awk-Programm kann aus einem BEGIN-, Haupt- und END-Teil bestehen, die nach folgendem Schema aufgebaut sind:

Syntax
BEGIN-Teil
[ BEGIN {aktion} ]
Hauptteil
[[auswahlbedingung] {aktion}
| auswahlbedingung [{aktion}]
| funktionsdefinition
.
.
.
                              ]
END-Teil
[ END {aktion} ]

auswahlbedingung

Mit auswahlbedingung gibt der Benutzer an, welche Daten aus den Eingabedateien ausgewählt werden sollen (siehe „Auswahlbedingungen“).

aktion

Mit aktion gibt der Benutzer an, was geschehen soll, wenn Daten entsprechend auswahlbbedingung auftreten (siehe „Aktionen“).

funktionsdefinition

Mit funktionsdefinition hat der Benutzer die Möglichkeit, eigene Funktionen zu definieren (siehe „Funktionen“).

Mindestens einer der drei Teile auswahlbedingung, aktion, funktionsdefinition muss vorhanden sein.
Von einem Paar auswahlbedingung {aktion} kann entweder die Auswahlbedingung oder die Aktion fehlen. Fehlt aktion, so wird jeweils die durch auswahlbedingung erfasste Zeile ausgegeben. Fehlt auswahlbedingung, so wird aktion für jede Zeile ausgeführt.
Die Definition einer benutzerdefinierten Funktion kann an beliebiger Stelle im Hauptteil erfolgen.
Folgende Teile müssen 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

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

  3. Abschlussarbeiten
    Wenn alle angegebenen Dateien abgearbeitet sind und ein END-Teil vorhanden ist, dann führt awk zum Schluss die im END-Teil angegebene Aktion aus. Danach beendet sich awk.


Eingabedatei

Eine Eingabedatei besteht aus Sätzen, die in Felder eingeteilt sind.

Sätze

Die Sätze sind durch ein Satztrennzeichen getrennt. Die Satztrennzeichen 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 Zeichenkette angegeben wird, wird nur das erste Zeichen dieser Zeichenkette 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 aktuellen Satz können Sie mit der vordefinierten Variablen $0 zugreifen. Näheres zu Variablen erfahren Sie im Abschnitt „Grundelemente der awk-Sprache“.

Felder

Jeder Satz ist in Felder unterteilt, die durch ein oder mehrere Feldtrennzeichen 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 vordefinierte Variable FS (FS - Field Separator), der Sie entweder beim Aufruf 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 Abschnitt „Reguläre Ausdrücke der POSIX-Shell“) 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: -F"x+"
Syntax im awk-Programm: FS=x+


Die Standard-Einstellung (beliebig lange Folge von Leer- und Tabulatorzeichen) kann also mit dem folgenden regulären Ausdruck dargestellt werden: [ \t]+ ( steht hier für das Leerzeichen, \t für das Tabulatorzeichen).

Beachten Sie, dass ein Neue-Zeile-Zeichen immer als Feldtrenner interpretiert 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“.

Beispiel

Standard-Einteilung

1.Feld  2. Feld   ...         5. Feld ...
Das     ist       der erste   Satz             <--- 1. Satz
und     das       ist der     zweite Satz.     <--- 2. Satz


Nicht-Standard-Einteilung: RS ="%"; FS =":";

1.Feld   2. Feld        3. Feld 
%Name  : Adresse      : Telefon          <--- 1. Satz
%SNI AG:81730 Muenchen:089-636-1         <--- 2. Satz

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

    • Wenn Sie dagegen FS explizit das Tabulatorzeichen zuweisen (FS="\t"), dann gilt nur noch das Tabulatorzeichen als Feldtrenner, das Leerzeichen nicht mehr.

  • Führende Feldtrenner und Folgen von Feldtrennern

    • Für die Feldtrenner Leer-, Tabulator- und Neue Zeile-Zeichen gilt:

    • Führende Feldtrenner werden ignoriert.

    • 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 Liste zeigt alle vordefinierten awk-Variablen, die die Eingabedatei betreffen und die jeweiligen Werte, mit denen awk diese Variablen standardmäßig belegt.

FILENAME

Name der aktuellen Eingabedatei, - bei Standard-Eingabe

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 Abschnitt „Grundelemente der awk-Sprache“.

Grundelemente der awk-Sprache

In diesem Abschnitt sind die Grundelemente der awk-Sprache zusammengestellt.
Die Grundelemente benötigen Sie bei der Formulierung von Auswahlbedingungen und Aktionen.

Kommentar

Sie können ein awk-Programm wie eine Shell-Prozedur kommentieren. Kommentar beginnt mit dem Zeichen # und geht bis zum Ende der Zeile.

Konstanten

Es gibt zwei Arten von Konstanten: zahl oder zeichenkette.

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 Exponent.
Die Mantisse besteht aus einer Ganzzahl mit oder ohne Nachkommateil.
Der Nachkommateil besteht aus einem Dezimalpunkt 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 "..." eingeschlossen, damit awk das Zeichen nicht als Variablennamen interpretiert. Ein Zeichen ist ein darstellbares Zeichen aus dem aktuell gültigen Zeichensatz (siehe Abschnitt „Zeichensatz EBCDIC (EDF04)“) oder eines der folgenden Sonderzeichen, die wie in C dargestellt werden:


\"für "
\\für \
\afür Klingelzeichen
\nfür Neue-Zeile-Zeichen
\tfür Tabulatorzeichen
\vfür Vertikaltabulator
\bfür Rücksetzzeichen (backspace)
\rfür Wagenrücklauf (carriage return)
\ffür Seitenvorschub


Variablen

awk ermöglicht die Verwendung von einfachen Variablen und Arrays, um Werte abzuspeichern.

Es gibt vordefinierte und benutzerdefinierte Variablen.

Variablennname

Der Name einer benutzerdefinierten Variablen fängt entweder mit einem Unterstrich _ , einem Großbuchstaben oder einem Kleinbuchstaben an und besteht nur aus Unterstrichen, Groß- und Kleinbuchstaben sowie Ziffern.

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.


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 initialisiert. 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 folgender Liste aufgeführten vordefinierten Variablen. In der Liste ist angegeben, welche Werte awk standardmäßig in diesen Variablen speichert. Der Benutzer kann den Variablen neue Werte zuweisen.

ARGC

Anzahl der Elemente im Array ARGV

ARGV

Array, das die Argumente der Kommandozeile enthält (ausgenommen Optionen und das Argument prog), nummeriert von 0 bis ARGC-1

CONVFMT

printf-Format, um Zahlen in Zeichenketten umzuwandeln

ENVIRON

Array mit den Werten der Umgebungsvariablen, die Indices sind die Namen der Variablen

FILENAME

Name der aktuellen Eingabedatei, - bei Standard-Eingabe

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 printf, Formatierte Ausgabe, )
(Standard: %.6g, höchstens 6 Stellen hinter dem Komma)

RS

Satztrenner für die Eingabe (Standard: Neue-Zeile-Zeichen)

RLENGTH

Länge der Zeichenkette, die die match-Funktion als passend erkannt hat

RSTART

Anfangsposition der Zeichenkette, die die match-Funktion als passend erkannt hat. Die Nummerierung 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 1

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 2

Der Inhalt von $0 bleibt unverändert, auch wenn NR verändert wird.

{print NR, $0; NR=NR+34; print NR, $0}

Die Ausgabe sieht dann etwa so aus:

10 Dies ist die zehnte Zeile

44 Dies ist die zehnte Zeile


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 3

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:


array_name[index]


array_name

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 muss auch keine Dimension festgelegt werden. Bei Bedarf wird automatisch ein neues Array-Element angelegt.

  • Arrays können assoziativ durchlaufen werden:
    Sie können einen alphanumerischen Index verwenden, um die Array-Elemente anzusprechen.
    Zum Durchlaufen aller Elemente eines assoziativen 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 ausgeführt (siehe Ablaufanweisung for).


Beispiel

In der Datei ausgaben sind Ausgaben erfasst. Für jede Ausgabe sind Tag, Monat, Betrag und eine Kurzbeschreibung angegeben. Die einzelnen Angaben 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 Beispielprogramm 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 Maerz 240.32

Gesamtausgaben Januar 7307.78

Gesamtausgaben Februar 45


Ausdrücke

Ein Ausdruck kann sein:

konstante
variable
funktionsaufruf
un_op ausdruck
ausdruck bin_op ausdruck
(ausdruck)
ausdruck ? ausdruck : ausdruck

konstante

numerische oder alphanumerische Konstante (siehe Grundelemente).

variable

Variable (siehe Grundelemente).

funktionsaufruf

Aufruf einer vordefinierten Funktion (siehe Funktionen).

ausdruck

Ausdruck.

un_op

unitärer Operator (siehe Operator-Tabelle).

bin_op

binärer Operator (siehe Operator-Tabelle).

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 Mustervergleich und Verkettung von Zeichenketten.
In der folgenden Liste sind alle awk-Operatoren nach steigender Priorität aufgeführt. Operatoren in einer Zeile haben die gleiche Priorität.


= Zuweisung
+= -= *= /= %= ^= zusammengesetzte Zuweisung wie in C
|| logisches ODER
&& logisches UND
!~ Mustervergleich
> >= < <= != == Vergleich
hintereinanderschreibenVerkettung
+ - plus, minus
* / % multiplizieren, dividieren, modulo
! logisches NICHT
^ ** Exponent
++ -- Inkrement, Dekrement
Auswertung von Ausdrücken

Für die Operanden ist kein Datentyp vorgeschrieben. Sie können numerische und alphanumerische Konstanten beliebig mischen. awk bestimmt aus dem Kontext, ob eine numerische oder alphanumerische Operation ausgeführt wird.
Beachten Sie, dass 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 einer solchen Operation wird, wenn es wahr ist, durch 1 dargestellt.


Beispiel:

(2&&2)+3=4

Auswahlbedingungen

Mit den Auswahlbedingungen gibt der Benutzer an, welche Daten aus den Eingabedateien ausgewählt werden sollen. Eine Auswahlbedingung kann sein:

/regulärer_ausdruck/
vergleich
mustervergleich
bereichsangabe
zusammengesetzte_auswahlbedingung

/regulärer_ausdruck/

Regulärer Ausdruck.
awk unterstützt erweiterte reguläre Ausdrücke (siehe Abschnitt „Reguläre Ausdrücke der POSIX-Shell“). Ein regulärer Ausdruck wird in Schrägstriche /.../ eingeschlossen.

Beispiel:

Regulärer Ausdruck, der für Folgen aus a, b oder c steht:

/[abc]+/


vergleich

Ein Vergleich ist ein Ausdruck (siehe Ausdrücke) mit Vergleichsoperatoren. Die Vergleichsoperatoren und ihre Bedeutung sind:


a > ba größer als b?
a >= ba größer als oder gleich b?
a < ba kleiner als b?
a <= ba kleiner als oder gleich b?
a == ba gleich b?
a != ba ungleich b?


Die Operanden a und b können beliebige Ausdrücke sein. Wenn beide Operanden numerisch sind, wird ein numerischer Vergleich durchgeführt, ansonsten ein alphanumerischer.


mustervergleich

Ein Mustervergleich ist ein Ausdruck (siehe Ausdrücke) mit Mustervergleichsoperatoren. Bei einem Mustervergleich wird eine Zeichenkette mit einem regulären Ausdruck, genannt Muster, verglichen. Die Mustervergleichsoperatoren und ihre Bedeutung sind:



zk ~ mZeichenkette zk passt zu Muster m
zk !~ mZeichenkette zk passt 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) muss zu dem regulären Ausdruck passen (~), d.h. am Anfang muss ein A oder a stehen.


bereichsangabe

Die Bereichsangabe hat die Form:

/regulärer_ausdruck/, /regulärer_ausdruck/

Die Bereichsangabe bedeutet, dass 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 Zeichenkette enthält, die zum ersten regulären Ausdruck passt. Der Bereich endet mit dem ersten Satz, der eine Zeichenkette enthält, die zum zweiten regulären  Ausdruck passt.


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) können Auswahlbedingungen negiert und mehrere Auswahlbedingungen zu einer Bedingung zusammengesetzt werden.

Die logischen Operatoren und ihre Bedeutung sind:


!awNegation der Auswahlbedingung aw
aw1 || aw2Auswahlbedingung aw1 oder aw2.
Die Bedingung ist erfüllt, wenn aw1 oder aw2 wahr (ungleich 0) ergibt.
aw1 && aw2Auswahlbedingung 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 Sortierreihenfolge der Bereich [M-Q] genau aus den Großbuchstaben M, N, O, P, Q, so erhält man dieselbe Auswahl durch folgenden Mustervergleich:


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.


Aktionen

In den Aktionen geben Sie an, was geschehen soll, wenn die zugehörige Auswahlbedingung zutrifft. Dies kann z.B. die Bearbeitung einer ausgewählten Daten sein. Die Aktion muss auf derselben Zeile wie die zugehörige Auswahlbedingung beginnen. Ist dies nicht möglich, so ist ein Neue-Zeile-Zeichen mit \ zu entwerten. Leer- und Tabulatorzeichen zwischen Aktion und Auswahlbedingung werden ignoriert. Eine Aktion besteht aus einer oder mehreren Anweisungen und muss in geschweifte Klammern {...} eingeschlossen sein:


{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 Abschnitt „Ausdrücke“).

ablaufanweisung

Mit ablaufanweisung können Sie den Ablauf des awk-Programms steuern (siehe Abschnitt „Ablaufanweisungen“).


Eine Anweisung kann mehrere Zeilen einnehmen. Dabei muss jede Zeile mit einem Gegenschrägstrich \ abgeschlossen werden. Hierdurch wird das Neue-Zeile-Zeichen entwertet.


Mehrere Anweisungen

Mehrere Anweisungen können durch geschweifte Klammern {} zusammengefasst 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:


breakSchleife abbrechen
continueRest eines Schleifendurchgangs überspringen
exitawk-Programm beenden
forGezählte Wiederholung und ARRAY-Durchlauf
ifBedingte Anweisung
nextMit dem nächsten Eingabesatz fortfahren
whileSchleife
doSchleife
delete array[i]Element i des Arrays array löschen
return xRücksprung aus einer Funktion mit Wertangabe
returnRücksprung aus einer Funktion ohne Wert


Die Ablaufanweisungen sind im Folgenden alphabetisch beschrieben.

break - Schleife abbrechen

break kann im Schleifenrumpf einer for-, while- oder do-Schleife verwendet werden. break bewirkt, dass die Schleife beendet wird.


Syntax


break


Beispiel

Solange ein Satz mit . beginnt, soll der nächste Satz eingelesen werden. Wenn das 2. Feld des eingelesenen Satzes größer als 1000 ist, soll abgebrochen werden.

{ while($1 ~ /^\./)
    {
       getline;
       if($2 > 1000) break;
    }
}
continue - Rest eines Schleifendurchlaufs überspringen

continue kann im Schleifenrumpf einer for-, while- oder do-Schleife verwendet werden. continue bewirkt, dass der aktuelle Schleifendurchlauf beendet und mit dem nächsten Durchlauf weitergemacht wird.


Syntax


continue


Beispiel

Es sollen nur gerade Felder ausgegeben werden:

{
   i=1;
   while(i++ <= NF)
      {
        if(i%2) continue;
        else print $i
      }
}
do - Schleife

Mit der do-Schleife (oder do- while-Schleife) wird eine Anweisung wiederholt, solange eine Bedingung erfüllt ist. Im Gegensatz zur while-Schleife wird die Anweisung auf jeden Fall mindestens einmal ausgeführt.


Syntax


do anweisung while (ausdruck)


anweisung

Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst und durch Strichpunkt ; oder Neue-Zeile-Zeichen getrennt werden.

ausdruck

Ausdruck (siehe Ausdrücke), 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 angegebene Abschluss-Aktion aus, ansonsten wird das Programm sofort beendet.


Syntax


exit


Beispiel

Wenn das Zeichen Klammeraffe in der Eingabe erscheint, soll das Ergebnis 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.


Syntax


for(ausdruck1; ausdruck2; ausdruck3) anweisung


ausdruck1

Ausdruck (siehe Ausdrücke).
ausdruck1 wird einmal bei Start der for-Anweisung ausgewertet.
Beispiel: i=1

ausdruck2

Ausdruck (siehe Ausdrücke).
ausdruck2 wird vor jedem Schleifendurchgang ausgewertet. anweisung wird nur ausgeführt, falls ausdruck2 ungleich 0 (wahr) ergibt, ansonsten wird die Wiederholung beendet.
Beispiel: i<10

ausdruck3

Ausdruck (siehe Ausdrücke).
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 {} zusammengefasst 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.


Syntax


for(index in array) anweisung


index

Variable (siehe Grundelemente), die in unbestimmter Reihenfolge alle Elemente des Arrays array durchläuft. Der Index kann numerisch oder alphanumerisch sein.

array

Array, das durchlaufen wird.

anweisung

Anweisung, die für jedes Array-Element ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst 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.


Syntax


if(ausdruck) anweisung1 [else anweisung2]


ausdruck

Ausdruck (siehe Ausdrücke), der die Bedingung angibt. Wenn ausdruck ungleich 0 (wahr) ergibt, wird anweisung1 ausgeführt.

anweisung1

Anweisung, die ausgeführt wird, falls ausdruck wahr ist. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.

anweisung2

Anweisung, die ausgeführt wird, falls ausdruck falsch ist. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.


Beispiel

Wenn Feld 1 größer als 2 ist, dann sollen die Felder 2 und 3 ausgegeben 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.


Syntax


next


Beispiel

Sätze, die mit . beginnen, sollen ignoriert werden:

{ if ($1 ~/^\./) next }
while - Schleife

Mit der while-Schleife wird eine Anweisung wiederholt, solange eine Bedingung erfüllt ist.


Syntax


while(ausdruck) anweisung


ausdruck

Ausdruck (siehe Ausdrücke), 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 { } zusammengefasst werden.


Beispiel

Alle Eingabefelder werden ausgegeben; jedes Feld wird in eine eigene Ausgabezeile geschrieben:

{ i = 1;
  while (i <= NF) {
      print $i
      i++
  }
}


Funktionen

awk stellt eine Reihe vordefinierter Funktionen zur Verfügung, bietet aber auch die Möglichkeit, eigene Funktionen zu definieren:


Syntax


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 gleichberechtigt neben auswahlbedingung {aktion}.

Funktionsaufrufe dürfen innerhalb eines Aktionsteils an beliebiger Stelle in einem Ausdruck stehen, nicht jedoch vor der Funktionsdefinition. Beim Aufruf darf zwischen dem Funktionsnamen und der öffnenden runden Klammer kein Leerzeichen stehen.

Funktionsaufrufe können geschachtelt werden, Funktionen dürfen rekursiv aufgerufen werden.

Bei den meisten Funktionen müssen Sie die Argumente nicht in Klammern einschließen. Klammern sind aber empfehlenswert, weil sie die Lesbarkeit 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 Argumenten wird zur Übergabe der Wert der Variable kopiert (call by value) - Sie können den Wert er Variablen aus der Funktion heraus nicht ändern. Argumente haben einen lokal auf die Funktion beschränkten Geltungsbereich, während alle anderen Variablen immer einen globalen haben. Benötigen Sie lokale Variablen in einer Funktion, dann definieren Sie diese am Ende der Argumentliste in der Funktionsdefinition. Jede Variable der Argumentliste, für die kein aktuelles Argument existiert, 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.

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


Eingabefunktion

getlineSatz einlesen


Ausgabefunktionen

print([arg,...])Standard-Ausgabefunktion
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()


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 passt
split(zk,array,[sep])Aufteilen einer Zeichenkette
sprintf(format,e1,e2,...)Formatierte Ausgabe in eine Variable
sub(re, repl[,in])Substitutionsfunktion
substr(zk,m,[n])Teilzeichenkette bestimmen
tolower(s)Umwandlung in Kleinbuchstaben
toupper(s)Umwandlung 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önnen als Argument eine Konstante angeben oder einen Ausdruck (siehe Ausdrücke). awk wertet die Argument-Ausdrücke zuerst aus und wendet 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.


Syntax


atan2(y,x)


y,x

Zahlen, für deren Quotient der Arcustangens berechnet werden soll.


close - Datei oder Pipe schließen

close schließt die angegebene Datei bzw. Pipe.


Syntax


close(expr)


expr

Name der Datei oder der Pipe, die geschlossen werden soll (siehe bei der Beschreibung der Funktionen print und printf den Abschnitt über Ausgabeumlenkung).


cos - Cosinus

cos berechnet den Cosinus einer Zahl.


Syntax


cos(x)


x

Zahl, für die der Cosinus berechnet werden soll.


exp - Exponentialfunktion

exp berechnet e hoch x.


Syntax


exp( x )


x

Zahl, für die ex berechnet werden soll.


getline - Einen Satz einlesen

awk liest einen Satz ein (siehe next, Ablaufanweisung).

getline hat mehrere Formate. Die Formate von getline haben folgende Rückgabewerte:


1bei fehlerfreiem Lesevorgang
0bei Dateiende
-1bei einem Fehler


Syntax


getline


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}


Syntax


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.


Syntax


getline var


awk liest in die Variable var den nächsten Eingabesatz aus der Eingabedatei ein. NR und FNR werden neu gesetzt.

var

Variable, in die der nächste Satz eingelesen werden soll.


Syntax


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.


Syntax


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.

Ist var angegeben, werden NR, NF, FNR, $0 und $1 bis $NF nicht verändert. Ist var nicht angegeben, werden NF, $0 und $1 bis $NF neu gesetzt.

Dieses Konstrukt wirkt wie der Aufruf der C-Funktion popen() 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 erweiterten regulären Ausdruck re passen, durch die Zeichenkette repl.
gsub liefert die Anzahl der Ersetzungen zurück.


Syntax


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, nummeriert ab 1) des ersten Vorkommens zurück. Wenn die Teilzeichenkette nicht vorkommt, gibt index 0 zurück.


Syntax


index( zk1,zk1 )


zk1

Zeichenkette, in der index die Teilzeichenkette sucht.

zk2

Teilzeichenkette, die index sucht.


Beispiel

Vergleich der Zeichenketten „ToTo-LoTo“ mit „To“

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.


Syntax


int( x )


x

Zahl, deren ganzzahliger Anteil bestimmt werden soll.


length - Länge bestimmen

length bestimmt die Länge einer Zeichenkette.


Syntax


lenght[( 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.


Syntax


log( x )


x

Zahl, für die der natürliche Logarithmus berechnet werden soll.


match - Prüffunktion für reguläre Ausdrücke

match prüft, ob eine Zeichenkette in zk zu dem erweiterten regulären Ausdruck re passt. match liefert die Stelle in zk (in Zeichen, nummeriert ab 1) zurück, an der die zu re passende Zeichenkette anfängt; wenn keine Zeichenkette in zk passt, 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 passt.


Syntax


match( zk,re )


zk

Zeichenkette, in der die Mustersuche stattfinden soll.

re

Erweiterter regulärer Ausdruck.


print - Standard-Ausgabefunktion

print ist die Standard-Ausgabefunktion. print gibt entweder den aktuellen 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".


Syntax


print( arg1[[,]arg2 ...] )[umlenkung]


Kein Argument angegeben:

print gibt den aktuellen Eingabesatz auf die Standard-Ausgabe aus.

arg1arg2

Argumente, die ausgegeben werden sollen. print wertet die Argument-Ausdrücke aus und hängt die Ergebnisse in der Reihenfolge der Argumente hintereinander.

arg1,arg2

Argumente, die ausgegeben werden sollen. print gibt die ausgewerteten 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-Anweisung stehen.

umlenkung

Sie können die Ausgabe in eine Datei umlenken oder an ein Programm weiterreichen. Maximal können Sie 10 Ausgabedateien verwenden.

umlenkung kann sein:

>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 demselben 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() [4] 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, eingeschlossen in "...", oder durch eine Variable, die den Dateinamen enthält.


Achtung!
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 beliebiges Zeichen zuweisen und damit den Ausgabe-Feldtrenner ändern.

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 Gleitkommawerte. OFMT ist standardmäßig "%.6g". Das bedeutet, dass Gleitkommazahlen mit maximal 6 Stellen hinter dem Dezimalpunkt ausgegeben werden. Sie können OFMT ein anderes printf-Format für Gleitkommazahlen zuweisen (siehe printf - Formatierte Ausgabe).


Beispiel

Erstes und zweites Feld, getrennt durch Leerzeichen, ausgeben:

{print $1,$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() angeben.


Syntax


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ächten Zeile positioniert.

Eine Formatangabe wird mit dem Prozent-Zeichen % eingeleitet. Die wichtigsten Formatelemente sind in der folgenden Liste zusammengestellt.


%cEinzelnes Zeichen
%dGanzzahl dezimal
%eGleitkommazahl in Exponent-Darstellung, z.B. 5.234e+2
%fGleitkommazahl, z.B. 52.34
%g%e oder %f, je nachdem, welche Darstellung kürzer ist
%oGanzzahl oktal (Basis 8)
%sZeichenkette
%uGanzzahl dezimal ohne Vorzeichen
%xGanzzahl 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 formatiert aus.

Wenn Formatangabe und Argument nicht zusammenpassen (Formatangabe  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 Standard-Ausgabe 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) }


rand - Zufallszahl liefern

rand liefert eine Zufallszahl r zurück, für die gilt: 0 <= r < 1.


Syntax


rand


Siehe auch srand.


sin - Sinus

sin liefert den Sinus einer Zahl.


Syntax


sin(x)


x

Zahl, deren Sinus berechnet werden soll.


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.


Syntax


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

Die Eingabe

{
      s=split("januar:februar:maerz", monate, ":");
      for(i=1; i<s; i++) print monate[i];
}

erzeugt die Ausgabe:

januar
februar
maerz


sprintf - Formatierte Ausgabe in Zeichenkette

Bei sprintf ist die Formatierung wie bei printf. Es erfolgt aber keine Ausgabe. Stattdessen gibt sprintf die formatierte Ausgabe als Ergebnis-Zeichenkette zurück. Diese Zeichenkette können Sie z.B. einer Variablen zuweisen.


Syntax


sprintf(format,arg,...)


format

Zeichenkette, die das Ausgabeformat enthält (siehe Formatierte Ausgabe).

arg

Argumente, die ausgegeben werden sollen (siehe Formatierte Ausgabe).


Beispiel

Das folgende awk-Programmstück erzeugt diesselbe Ausgabe wie das Beispiel bei printf.

{ x = sprintf("%2d**%5s\n", $1,$2); print x }


sqrt - Quadratwurzel berechnen

sqrt berechnet die Quadratwurzel zu einer Zahl.


Syntax


sqrt(x)


x

Zahl, deren Quadratwurzel berechnet werden soll.


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.


Syntax


srand([x])


x

Zahl, die als Anfangs-Berechnungswert für rand dienen soll.


sub - Globale Substitutionsfunktion

sub ersetzt die erste Zeichenkette in $0 bzw. in in, die zu dem erweiterten regulären Ausdruck re passt, durch die Zeichenkette repl.
sub liefert die Anzahl der Ersetzungen zurück.


Syntax


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.


Syntax


substr(zk,m[,n])


zk

Zeichenkette, aus der eine Teilzeichenkette ausgewählt werden soll.

m

n

Maximale Länge der Teilzeichenkette.

n nicht angegeben:
Die Teilzeichenkette geht bis zum Ende von zk.


Beispiel

Die Eingabe

{
   x = substr("060795",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.


Syntax


system(kommando)


kommando

Name des Shell-Kommandos, das ausgeführt werden soll.


Fehler

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 folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos awk:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind.

Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_COLLATE

Legt in geklammerten regulären Ausdrücken die Bedeutung von Zeichenbereichen, Äquivalenzklassen und Zeicheneinheiten fest, während LC_C TYPE die Bedeutung von Zeichenklassen festlegt. LC_COLLATE bestimmt das Verhalten von Vergleichsoperatoren beim Vergleich von Zeichenketten.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten).

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

LC_NUMERIC

Legt die Darstellung von Dezimalpunkt, Exponentzeichen und Tausendertrennzeichen fest.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

PATH

Legt den Suchpfad fest, wenn ein Kommando durch system(kommando), Ein- oder Ausgabepipes ausgeführt werden soll.


Beispiele zu awk

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


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 übersichtlicheres 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"      " ). 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:

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 Dollarzeichen $ umdefiniert. Feldtrenner sind daher Leer-, Tabulator- und Neue-Zeile-Zeichen:

BEGIN { RS="$"; printf "Satz\tAnz" }
{
  printf ("\n%4d\t%3d\t", 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


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 , fgrep , grep , lex, sed