Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

egrep(1)

fgrep(1)

grep(1)

lex(1)

sed(1)

expressions(5)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026