(pattern scanning and processing language)
awk ist ein programmgesteuertes Textbearbeitungssystem.
Sie geben beim Aufruf des awk das auszuführende awk-Programm und die Namen der zu bearbeitenden Dateien an. awk führt dann die durch das Programm festgelegte Bearbeitung mit den angegebenen Dateien aus. awk verändert die Eingabedateien nicht. Standardmäßig schreibt awk das Ergebnis der Bearbeitung auf die Standard-Ausgabe.
Im Vergleich zu Textbearbeitungsprogrammen wie egrep und sed bietet awk folgende Vorteile:
awk arbeitet satzweise. Ein Eingabesatz ist zwar wie bei egrep und sed standardmäßig eine Zeile, der Benutzer kann diese Einstellung aber ändern und andere Texteinheiten als Satz definieren.
Jeder Eingabesatz ist in Felder aufgeteilt, die einzeln angesprochen werden können.
Eine Auswahlbedingung kann eine aus erweiterten regulären Ausdrücken und Vergleichen zusammengesetzte Bedingung sein.
Der Benutzer kann beliebige Aktionen programmieren. Die awk-Sprache ist eine höhere, C-ähnliche Programmiersprache.
Die Beschreibung des awk gliedert sich in folgende Abschnitte:
Syntax
Format 1: |
awk[ -F ERE] |
Format 2: |
awk[ -F ERE] |
Trennzeichen zwischen den Feldern eines Eingabesatzes festlegen.
Erweiterter regulärer Ausdruck zur Bestimmung des Trennzeichens zwischen den Feldern eines Eingabesatzes. Das Trennzeichen gehört nicht zu einem Feld. Wenn Sie als Trennzeichen zwischen den Feldern eines Eingabesatzes das Zeichen t verwenden wollen, so müssen Sie es beim awk-Aufruf oder im BEGIN-Teil des awk-Programms folgendermaßen angeben: -F Leer- und Tabulatorzeichen gelten als Feldtrenner.
Wertzuweisung der Form var=wert. var Name der Variablen, die initialisiert werden soll. wert Wert, mit dem die Variable var initialisiert werden soll. wert kann genauso definiert werden, wie eine Umgebungsvariable in der Shell. Die Wertzuweisung über -v initialisierung ist identisch mit der Wertzuweisung über initialisierung (siehe dort).
Angabe des awk-Programms. prog kann sein: ’awk_programm’; ein awk-Programm in der Kommandozeile -f progdat; der Name einer Datei, die ein awk-Programm enthält. ’awk_programm’ Ein awk-Programm in der Kommandozeile. Beispiel Alle Zeilen aus der Datei eingabe ausgeben, deren drittes Feld aus dem Zeichen ’0’ besteht:
Das awk-Programm steht in der Datei progdat. initialisierung Wertzuweisung der Form: var=wert awk initialisiert die Variable var (egal, ob diese im awk-Programm vorkommt oder nicht) mit wert. initialisierung und datei können in beliebiger Reihenfolge angegeben werden. Die Wertzuweisung erfolgt zu dem Zeitpunkt, zu dem normalerweise die an der Position stehende Datei geöffnet worden wäre. Ausnahme Die $-Variablen (siehe Grundelemente) können nicht auf diese Weise initialisiert werden. var Name der Variablen, die initialisiert werden soll. Die Variable darf nicht mit $ beginnen. wert Wert, mit dem die Variable var initialisiert werden soll. wert kann genauso definiert werden wie eine Umgebungsvariable in der Shell. datei Name der Textdatei, die bearbeitet werden soll. Sie können mehrere Dateien angeben. Bei mehreren Angaben verarbeitet awk die Dateien in der angegebenen Reihenfolge. Wenn Sie für datei einen Bindestrich - angeben, liest awk von der Standard-Eingabe. datei nicht angegeben: |
Verwendungsmöglichkeiten für awk
awk ist ein Werkzeug, mit dem Sie Textbearbeitungsaufgaben bequem lösen können.
Typische Anwendungen sind:
Daten aus Dateien heraussuchen
Dateiinhalte überprüfen
Berechnungen mit den Daten in einer Datei durchführen
Format der Eingabedaten ändern.
Dieser Abschnitt zeigt an vier einfachen Beispielen, wie Sie awk anwenden können.
Beispiel
Die Datei artikel enthält eine Aufstellung von Büroartikeln. Angegeben sind jeweils der Artikelname, die Stückzahl und der Einzelpreis:
Bleistift 1500 0.60 Tisch 5 345.00 Lampe 20 79.80 Papier 75 1.00 Diskette 1000 2.40 Umschlag 100 0.20
Beispiel 1
Alle Artikel heraussuchen, deren Stückzahl größer als 100 ist:
|
Mit $2 sprechen Sie das zweite Feld einer Zeile an, das in diesem Beispiel die Stückzahl eines Artikels enthält. Wenn die Stückzahl größer als 100 ist, ist die Bedingung erfüllt und die Funktion print wird ausgeführt. Da für print keine Argumente angegeben sind, gibt print die ganze Zeile aus.
Beispiel 2
Für alle Artikel mit einer Stückzahl größer als 100 den Gesamtpreis berechnen und zusammen mit der Artikelbezeichnung ausgeben:
|
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:
|
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:
|
Dieses Beispiel zeigt die Verwendung des END-Teils. awk führt die Aktion hinter END nur einmal vor Beendigung des Programms aus. Deshalb wird die Summe aller Beträge genau einmal am Ende ausgegeben.
Struktur eines awk-Programms
Ein awk-Programm kann aus einem BEGIN-, Haupt- und END-Teil bestehen, die nach folgendem Schema aufgebaut sind:
Syntax
- BEGIN-Teil –
[ BEGIN {aktion} ]
– Hauptteil –
[[auswahlbedingung] {aktion}
| auswahlbedingung [{aktion}]
| funktionsdefinition . . . ]
– END-Teil –
[ END {aktion} ]
|
auswahlbedingung Mit auswahlbedingung gibt der Benutzer an, welche Daten aus den Eingabedateien ausgewählt werden sollen (siehe „Auswahlbedingungen“). aktion Mit aktion gibt der Benutzer an, was geschehen soll, wenn Daten entsprechend auswahlbbedingung auftreten (siehe „Aktionen“). funktionsdefinition Mit funktionsdefinition hat der Benutzer die Möglichkeit, eigene Funktionen zu definieren (siehe „Funktionen“). Mindestens einer der drei Teile auswahlbedingung, aktion, funktionsdefinition muss vorhanden sein.
|
Arbeitsweise von awk
awk führt das vom Benutzer angegebene awk-Programm aus. Dabei geht awk im Einzelnen wie folgt vor:
Anfangsarbeiten
Wenn Variablen angegeben wurden, so werden als erstes diese Variablen initialisiert. Falls ein BEGIN-Teil mit aktion vorhanden ist, führt awk dann die dort festgelegte Aktion aus. Die im BEGIN-Teil angegebene Aktion wird genau einmal ausgeführt und zwar vor der Bearbeitung der ersten Eingabezeile.Dateibearbeitung
Anschließend verarbeitet awk die angegebenen Eingabedateien. awk liest die Eingabesätze der Reihe nach ein. Für jeden Eingabesatz prüft awk jede Auswahlbedingung ab und zwar in der Reihenfolge, wie sie im awk-Programm angegeben sind. Wenn eine Auswahlbedingung zutrifft, wird die zugehörige Aktion ausgeführt.
Wenn zu einer Aktion keine Auswahlbedingung angegeben ist, führt awk die Aktion für jeden Satz aus. Wenn zu einer Auswahlbedingung keine Aktion angegeben ist, ist die Standard-Aktion Ausgabe des Satzes.
Mehrere Eingabedateien werden in der angegebenen Reihenfolge abgearbeitet.Abschlussarbeiten
Wenn alle angegebenen Dateien abgearbeitet sind und ein END-Teil vorhanden ist, dann führt awk zum Schluss die im END-Teil angegebene Aktion aus. Danach beendet sich awk.
Eingabedatei
Eine Eingabedatei besteht aus Sätzen, die in Felder eingeteilt sind.
Sätze
Die Sätze sind durch ein Satztrennzeichen getrennt. Die Satztrennzeichen sind nicht Bestandteil des Satzes. Standardmäßig ist ein Satz eine Zeile und das Satztrennzeichen ist das Neue-Zeile-Zeichen. Der Benutzer hat die Möglichkeit, diese Einteilung zu ändern. Dazu gibt es die vordefinierte Variable RS (RS - Record Separator), der Sie ein beliebiges Zeichen zuweisen können. Falls als Wert für RS eine Zeichenkette angegeben wird, wird nur das erste Zeichen dieser Zeichenkette berücksichtigt. Die Anzahl der aktuell verarbeiteten Sätze wird in der Variablen NR (NR - Number of Records) gezählt. Bei mehreren Eingabedateien wird NR über alle Dateien hochgezählt. Auf den aktuellen Satz können Sie mit der vordefinierten Variablen $0 zugreifen. Näheres zu Variablen erfahren Sie im Abschnitt „Grundelemente der awk-Sprache“.
Felder
Jeder Satz ist in Felder unterteilt, die durch ein oder mehrere Feldtrennzeichen getrennt sind. Standardmäßig ist eine beliebig lange Folge von Leer- und Tabulatorzeichen ein Feldtrenner. Der Benutzer hat die Möglichkeit, diese Einteilung zu ändern. Dazu gibt es die vordefinierte Variable FS (FS - Field Separator), der Sie entweder beim Aufruf durch Angabe der Option -F oder im awk-Programm ein beliebiges anderes Zeichen zuweisen können. Der an FS zugewiesene Wert wird als erweiterter regulärer Ausdruck (siehe Abschnitt „Reguläre Ausdrücke der POSIX-Shell“) interpretiert.
Beispiel 1
Sie wollen die Zeichen x und y als alternative Feldtrenner definieren.
Syntax beim awk-Aufruf: -F"[xy]"
Syntax im awk-Programm: FS=[xy]
Beispiel 2
Sie wollen eine beliebig lange Folge des Zeichens x als Feldtrenner definieren.
Syntax beim awk-Aufruf: -F"x+"
Syntax im awk-Programm: FS=x+
Die Standard-Einstellung (beliebig lange Folge von Leer- und Tabulatorzeichen) kann also mit dem folgenden regulären Ausdruck dargestellt werden: [ \t]+
(
steht hier für das Leerzeichen, \t für das Tabulatorzeichen).
Beachten Sie, dass ein Neue-Zeile-Zeichen immer als Feldtrenner interpretiert wird, egal welchen Wert FS hat!
Die Anzahl der Felder des aktuellen Satzes wird in der Variablen NF (NF - Number of Fields) gespeichert. Auf die einzelnen Felder des aktuellen Satzes können Sie mit den vordefinierten Variablen $1, $2 bis $NF zugreifen. Näheres zu Variablen erfahren Sie im Abschnitt „Grundelemente der awk-Sprache“.
Beispiel
Standard-Einteilung
1.Feld 2. Feld ... 5. Feld ... Das ist der erste Satz <--- 1. Satz und das ist der zweite Satz. <--- 2. Satz
Nicht-Standard-Einteilung: RS ="%"; FS =":";
1.Feld 2. Feld 3. Feld %Name : Adresse : Telefon <--- 1. Satz %SNI AG:81730 Muenchen:089-636-1 <--- 2. Satz
Regeln für Satz- und Feldtrennzeichen
Standard-Einstellungen für Satztrenner
Standardmäßig ist das Neue-Zeile-Zeichen das Satztrennzeichen.
Wenn RS die leere Zeichenkette ist (RS=""), besteht die Datei aus einem einzigen Satz. Falls mehrere Dateien angegeben werden, besteht jede Datei aus einem einzigen Satz (NR hat am Ende die Anzahl der Dateien als Wert).
Standard-Einstellungen für Feldtrenner
Wenn der Satztrenner das Neue-Zeile-Zeichen ist, dann gelten standardmäßig Leer- und Tabulatorzeichen als Feldtrenner.
Wenn der Satztrenner nicht das Neue-Zeile-Zeichen ist, dann gilt das Neue-Zeile-Zeichen immer als Feldtrenner, unabhängig davon, welches Zeichen als Feldtrenner definiert ist (siehe Felder, Beispiel 2).
Wenn Sie FS explizit das Leerzeichen zuweisen, durch Aufruf von awk mit -F" " oder mit der Zuweisung FS=" ", dann gelten Leer- und Tabulatorzeichen als Feldtrenner.
Wenn Sie dagegen FS explizit das Tabulatorzeichen zuweisen (FS="\t"), dann gilt nur noch das Tabulatorzeichen als Feldtrenner, das Leerzeichen nicht mehr.
Führende Feldtrenner und Folgen von Feldtrennern
Für die Feldtrenner Leer-, Tabulator- und Neue Zeile-Zeichen gilt:
Führende Feldtrenner werden ignoriert.
Beliebige Folgen von Feldtrennern werden als ein Trennzeichen gezählt (siehe Beispiel 9).
Bei jedem anderen Feldtrenner werden führende Feldtrenner gezählt. Bei einer Folge von Feldtrennern wird jedes Zeichen einzeln gezählt. Zwei aufeinanderfolgende Feldtrenner ergeben daher ein leeres Feld. (siehe Beispiel 10).
Einteilungen verändern
Sie können RS im awk-Programm verändern, wenn Sie für eine Datei verschiedene Satzeinteilungen benötigen. Der neue Satztrenner gilt, sobald die Zuweisung an RS ausgeführt wurde. Ebenso können Sie FS im awk-Programm verändern, wenn Sie für eine Datei verschiedene Feldeinteilungen benötigen. Der neue Feldtrenner gilt, sobald die Zuweisung an FS ausgeführt wurde.
Vordefinierte Variablen für die Eingabedatei
Die folgende Liste zeigt alle vordefinierten awk-Variablen, die die Eingabedatei betreffen und die jeweiligen Werte, mit denen awk diese Variablen standardmäßig belegt.
FILENAME
Name der aktuellen Eingabedatei, - bei Standard-Eingabe
FS
Feldtrenner für die Eingabe (Standard: beliebig lange Folge von Leer- und Tabulatorzeichen)
NF
Anzahl der Felder des aktuellen Satzes
NR
Laufende Nummer des aktuellen Satzes im Input
FNR
Laufende Nummer des aktuellen Satzes in der aktuellen Datei
RS
Satztrenner für die Eingabe (Standard: Neue-Zeile-Zeichen)
$0
Aktueller Satz
$1
Erstes Feld des aktuellen Satzes
$2
Zweites Feld des aktuellen Satzes
...
$NF
Letztes Feld des aktuellen Satzes
Sie können die Variablen im awk-Programm verändern. Die Eingabedatei wird dadurch aber nicht verändert. Näheres zu Variablen erfahren Sie im Abschnitt „Grundelemente der awk-Sprache“.
Grundelemente der awk-Sprache
In diesem Abschnitt sind die Grundelemente der awk-Sprache zusammengestellt.
Die Grundelemente benötigen Sie bei der Formulierung von Auswahlbedingungen und Aktionen.
Kommentar
Sie können ein awk-Programm wie eine Shell-Prozedur kommentieren. Kommentar beginnt mit dem Zeichen # und geht bis zum Ende der Zeile.
Konstanten
Es gibt zwei Arten von Konstanten: zahl oder zeichenkette.
zahl
Eine Zahl (numerische Konstante) ist eine Ganzzahl oder eine Gleitkommazahl mit oder ohne Vorzeichen. awk überprüft das Format nicht. Wenn eine Zahl ungültige Zeichen enthält, versucht awk einen gültigen Teil herauszufiltern und ignoriert den Rest.
ganzzahl
Eine Ganzzahl ist eine Folge aus den Ziffern 0 bis 9.
gleitkommazahl
Eine Gleitkommazahl besteht aus Mantisse mit oder ohne Exponent.
Die Mantisse besteht aus einer Ganzzahl mit oder ohne Nachkommateil.
Der Nachkommateil besteht aus einem Dezimalpunkt und einer Ganzzahl.
zeichenkette
Eine Zeichenkette (alphanumerische Konstante) ist eine Folge von Zeichen, eingeschlossen in Anführungszeichen "...". Fehlen die Anführungszeichen, dann interpretiert awk die Zeichenkette als Variablennamen, Zahl oder Operator.
zeichen
Ein Einzelzeichen wird auch in Anführungszeichen "..." eingeschlossen, damit awk das Zeichen nicht als Variablennamen interpretiert. Ein Zeichen ist ein darstellbares Zeichen aus dem aktuell gültigen Zeichensatz (siehe Abschnitt „Zeichensatz EBCDIC (EDF04)“) oder eines der folgenden Sonderzeichen, die wie in C dargestellt werden:
\" | für " |
\\ | für \ |
\a | für Klingelzeichen |
\n | für Neue-Zeile-Zeichen |
\t | für Tabulatorzeichen |
\v | für Vertikaltabulator |
\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.
Variablennname
Der Name einer benutzerdefinierten Variablen fängt entweder mit einem Unterstrich _ , einem Großbuchstaben oder einem Kleinbuchstaben an und besteht nur aus Unterstrichen, Groß- und Kleinbuchstaben sowie Ziffern.
Datentyp
Variablen haben keinen Datentyp. Sie können derselben Variablen sowohl eine Zahl als auch eine Zeichenkette zuweisen. In einem eindeutig numerischen Kontext werden Variablen als numerische Variablen behandelt, ansonsten gelten sie standardmäßig als alphanumerisch.
Beispiel:
x = "Mueller"; | # die Variable x enthält die Zeichenkette Mueller |
|
|
Definition
Variablen werden nicht explizit definiert. Benutzerdefinierte Variablen sind mit der ersten Verwendung automatisch definiert.
Initialisierung
Die vordefinierten Variablen werden von awk wie vorgesehen belegt. Benutzerdefinierte Variablen werden von awk standardmäßig je nach Kontext mit der leeren Zeichenkette bzw. mit Null initialisiert. Bei Aufruf von awk können Sie andere Initialisierungen angeben.
Ausnahmen
Für i>NF ist $i nicht unbedingt die leere Zeichenkette.
$-Variablen können nicht bei Aufruf initialisiert werden.
Vordefinierte Variablen
awk kennt die in folgender Liste aufgeführten vordefinierten Variablen. In der Liste ist angegeben, welche Werte awk standardmäßig in diesen Variablen speichert. Der Benutzer kann den Variablen neue Werte zuweisen.
ARGC
Anzahl der Elemente im Array ARGV
ARGV
Array, das die Argumente der Kommandozeile enthält (ausgenommen Optionen und das Argument prog), nummeriert von 0 bis ARGC-1
CONVFMT
printf-Format, um Zahlen in Zeichenketten umzuwandeln
ENVIRON
Array mit den Werten der Umgebungsvariablen, die Indices sind die Namen der Variablen
FILENAME
Name der aktuellen Eingabedatei, - bei Standard-Eingabe
FS
Feldtrenner für die Eingabe (Standard: beliebig lange Folge von Leer- und Tabulatorzeichen)
NF
Anzahl der Felder des aktuellen Satzes
NR
Laufende Nummer des aktuellen Satzes im Input
FNR
Laufende Nummer des aktuellen Satzes in der aktuellen Datei
OFS
Feldtrenner für die Ausgabe (Standard: Leerzeichen)
ORS
Satztrenner für die Ausgabe (Standard: Neue-Zeile-Zeichen)
OFMT
Ausgabeformat für Gleitkommazahlen (siehe printf, Formatierte Ausgabe, )
(Standard: %.6g, höchstens 6 Stellen hinter dem Komma)
RS
Satztrenner für die Eingabe (Standard: Neue-Zeile-Zeichen)
RLENGTH
Länge der Zeichenkette, die die match-Funktion als passend erkannt hat
RSTART
Anfangsposition der Zeichenkette, die die match-Funktion als passend erkannt hat. Die Nummerierung fängt mit 1 an. Dieser Wert entspricht immer dem Return-Wert der match-Funktion.
SUBSEP
Subscript-Zeichenketten-Trenner für mehrdimensionale Arrays.
Standard-Einstellung ist \034.
$0
Aktueller Satz
$ n
n-tes Feld des aktuellen Satzes
$NF
letztes Feld des aktuellen Satzes
Wie wirkt sich die Änderung von vordefinierten Variablen aus?
Beispiel 1
Durch die Zuweisung
$1 = "neu";
wird $1 die Zeichenkette neu zugewiesen. Das erste Feld des aktuellen Eingabesatzes bleibt aber unverändert.
Das gilt auch für folgende awk-Einstellungen, die die Eingabedatei betreffen:
Die aktuelle Eingabedatei ändert sich nicht, wenn Sie FILENAME einen neuen Namen zuweisen.
Wenn Sie an eine Variable $i mit i>NF einen Wert zuweisen, bekommt NF den Wert i zugewiesen.
Wenn Sie NR einen neuen Wert zuweisen, wird nur die Zeilennummer verändert, aber die Einstellung, welcher Satz der aktuelle ist, bleibt unverändert.
Beispiel 2
Der Inhalt von $0 bleibt unverändert, auch wenn NR verändert wird.
{print NR, $0; NR=NR+34; print NR, $0}
Die Ausgabe sieht dann etwa so aus:
10 Dies ist die zehnte Zeile
44 Dies ist die zehnte Zeile
Wenn Sie einer Variablen einen neuen Wert zuweisen, wird der alte Inhalt gelöscht. Wenn Sie z.B. NF verändern, ist die Information über die Feld-Anzahl des aktuellen Satzes verloren.
Besonderheit bei $-Variablen:
Sie können die Nummer einer $-Variablen als Konstante angeben oder durch einen Ausdruck, der bei Auswertung die Nummer ergibt.
Beispiel 3
Mit
$(NF-1)
sprechen Sie das vorletzte Feld an.
Array
Ein Array ist ein Feld von Konstanten oder Variablen.
Ein Array-Element wird angesprochen mit:
array_name[index]
|
array_name
Variablenname.
index
einfache Variable.
Der Index kann numerisch oder alphanumerisch sein. Sie können für index daher eine Zahl, eine Zeichenkette oder einen Ausdruck angeben, der bei Auswertung den Indexwert ergibt.
awk bietet bezüglich Arrays zwei besondere Möglichkeiten:
Arrays werden dynamisch angelegt:
Arrays werden wie einfache Variablen nicht deklariert, insbesondere muss auch keine Dimension festgelegt werden. Bei Bedarf wird automatisch ein neues Array-Element angelegt.Arrays können assoziativ durchlaufen werden:
Sie können einen alphanumerischen Index verwenden, um die Array-Elemente anzusprechen.
Zum Durchlaufen aller Elemente eines assoziativen Arrays gibt es die spezielle Laufanweisung:for(index in array) anweisung
index durchläuft in unbestimmter Reihenfolge die bisher vorhandenen Indexwerte. Für jedes Array-Element wird anweisung einmal ausgeführt (siehe Ablaufanweisung for).
Beispiel
In der Datei ausgaben sind Ausgaben erfasst. Für jede Ausgabe sind Tag, Monat, Betrag und eine Kurzbeschreibung angegeben. Die einzelnen Angaben sind durch Doppelpunkt : getrennt, z.B.:
01:Januar: 40.78:Buerobedarf 05:Januar: 6789.00:Laser-Drucker 23:Maerz: 240.32:Lampen 11:Januar: 478.00:Stuehle 01:Februar: 45.00:Literatur
Durch Verwendung eines assoziativen Arrays können Sie aus dieser Datei sehr einfach die Gesamtausgaben für jeden Monat berechnen. Das Beispielprogramm verwendet das Array mausgaben und die Monatsnamen als alphanumerischen Index. Für jede Zeile werden die Ausgaben im dritten Feld ($3) zu den Ausgaben des Monats addiert, der in dem zweiten Feld ($2) steht.
|
Ausdrücke
Ein Ausdruck kann sein:
|
konstante
numerische oder alphanumerische Konstante (siehe Grundelemente).
variable
Variable (siehe Grundelemente).
funktionsaufruf
Aufruf einer vordefinierten Funktion (siehe Funktionen).
ausdruck
Ausdruck.
un_op
unitärer Operator (siehe Operator-Tabelle).
bin_op
binärer Operator (siehe Operator-Tabelle).
Ausdrücke werden ausgewertet und liefern einen Wert. Sie können in Auswahlbedingungen und Aktionen vorkommen.
awk-Operatoren
awk kennt alle C-Operatoren und zusätzlich die Operatoren für Mustervergleich und Verkettung von Zeichenketten.
In der folgenden Liste sind alle awk-Operatoren nach steigender Priorität aufgeführt. Operatoren in einer Zeile haben die gleiche Priorität.
= | Zuweisung |
+= -= *= /= %= ^= | zusammengesetzte Zuweisung wie in C |
|| | logisches ODER |
&& | logisches UND |
~ !~
| Mustervergleich |
> >= < <= != == | Vergleich |
hintereinanderschreiben | Verkettung |
+ -
| plus, minus |
* / %
| multiplizieren, dividieren, modulo |
!
| logisches NICHT |
^ **
| Exponent |
++ --
| Inkrement, Dekrement |
Auswertung von Ausdrücken
Für die Operanden ist kein Datentyp vorgeschrieben. Sie können numerische und alphanumerische Konstanten beliebig mischen. awk bestimmt aus dem Kontext, ob eine numerische oder alphanumerische Operation ausgeführt wird.
Beachten Sie, dass es wie in C keine speziellen Wahrheitswerte gibt. Bei awk gilt wie bei C Null als falsch und ein Wert ungleich Null als wahr. Dies bedeutet, als Argument einer logischen Operation wird jeder Wert ungleich 0 als wahr erkannt. Das Ergebnis einer einer solchen Operation wird, wenn es wahr ist, durch 1 dargestellt.
Beispiel:
(2&&2)+3=4
Auswahlbedingungen
Mit den Auswahlbedingungen gibt der Benutzer an, welche Daten aus den Eingabedateien ausgewählt werden sollen. Eine Auswahlbedingung kann sein:
/regulärer_ausdruck/
vergleich mustervergleich bereichsangabe zusammengesetzte_auswahlbedingung |
/regulärer_ausdruck/
Regulärer Ausdruck.
awk unterstützt erweiterte reguläre Ausdrücke (siehe Abschnitt „Reguläre Ausdrücke der POSIX-Shell“). Ein regulärer Ausdruck wird in Schrägstriche /.../ eingeschlossen.
Beispiel:
Regulärer Ausdruck, der für Folgen aus a, b oder c steht:
/[abc]+/
vergleich
Ein Vergleich ist ein Ausdruck (siehe Ausdrücke) mit Vergleichsoperatoren. Die Vergleichsoperatoren und ihre Bedeutung sind:
a > 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 durchgeführt, ansonsten ein alphanumerischer.
mustervergleich
Ein Mustervergleich ist ein Ausdruck (siehe Ausdrücke) mit Mustervergleichsoperatoren. Bei einem Mustervergleich wird eine Zeichenkette mit einem regulären Ausdruck, genannt Muster, verglichen. Die Mustervergleichsoperatoren und ihre Bedeutung sind:
zk ~ m | Zeichenkette zk passt zu Muster m |
zk !~ m | Zeichenkette zk passt nicht zu Muster m |
Mit einem Mustervergleich als Auswahlbedingung können Sie einzelne Felder auswählen.
Beispiel:
Alle Sätze auswählen, deren erstes Feld mit A oder a beginnt:
$1 ~ /^[Aa]/
Der reguläre Ausdruck ^[Aa] steht für Zeichenketten mit A oder a am Anfang. Das erste Feld des Satzes ($1) muss zu dem regulären Ausdruck passen (~), d.h. am Anfang muss ein A oder a stehen.
bereichsangabe
Die Bereichsangabe hat die Form:
/regulärer_ausdruck/, /regulärer_ausdruck/
Die Bereichsangabe bedeutet, dass die zugehörige Aktion für alle Sätze ausgeführt werden soll, die innerhalb des Bereichs liegen. Anfang und Ende des Bereichs werden durch zwei reguläre Ausdrücke festgelegt. Der Bereich beginnt mit dem ersten Satz, der eine Zeichenkette enthält, die zum ersten regulären Ausdruck passt. Der Bereich endet mit dem ersten Satz, der eine Zeichenkette enthält, die zum zweiten regulären Ausdruck passt.
Beispiel
Sie wollen den Bereich von der ersten Zeile, die mit C beginnt, bis zur ersten Zeile, die mit K beginnt, auswählen und von jeder Zeile in diesem Bereich das erste Feld ausgeben lassen:
/^C/, /^K/ {print $1}
zusammengesetzte_auswahlbedingung
Mit den logischen Operatoren (siehe Ausdrücke) können Auswahlbedingungen negiert und mehrere Auswahlbedingungen zu einer Bedingung zusammengesetzt werden.
Die logischen Operatoren und ihre Bedeutung sind:
!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 Sortierreihenfolge der Bereich [M-Q] genau aus den Großbuchstaben M, N, O, P, Q, so erhält man dieselbe Auswahl durch folgenden Mustervergleich:
NF%2==0 && $1 ~ /^[MNOP]/
Die erste awk-Zeile kann in Abhängigkeit von der Sortierreihenfolge des aktuellen Zeichensatzes unterschiedliche Ergebnisse liefern. Die zweite awk-Zeile wählt immer nur die Sätze aus, deren erstes Feld mit den Buchstaben M, N, O oder P beginnt.
Aktionen
In den Aktionen geben Sie an, was geschehen soll, wenn die zugehörige Auswahlbedingung zutrifft. Dies kann z.B. die Bearbeitung einer ausgewählten Daten sein. Die Aktion muss auf derselben Zeile wie die zugehörige Auswahlbedingung beginnen. Ist dies nicht möglich, so ist ein Neue-Zeile-Zeichen mit \ zu entwerten. Leer- und Tabulatorzeichen zwischen Aktion und Auswahlbedingung werden ignoriert. Eine Aktion besteht aus einer oder mehreren Anweisungen und muss in geschweifte Klammern {...} eingeschlossen sein:
{anweisung [;anweisung]...}
|
Eine Anweisung kann sein:
ausdruck |
ausdruck
Der Ausdruck wird ausgewertet, jedoch nur dann weiter verwertet, wenn ausdruck eine Zuweisung, ein Inkrement oder ein Dekrement ist (siehe Abschnitt „Ausdrücke“).
ablaufanweisung
Mit ablaufanweisung können Sie den Ablauf des awk-Programms steuern (siehe Abschnitt „Ablaufanweisungen“).
Eine Anweisung kann mehrere Zeilen einnehmen. Dabei muss jede Zeile mit einem Gegenschrägstrich \ abgeschlossen werden. Hierdurch wird das Neue-Zeile-Zeichen entwertet.
Mehrere Anweisungen
Mehrere Anweisungen können durch geschweifte Klammern {} zusammengefasst werden. Anweisungen werden voneinander getrennt durch:
Strichpunkt ;
geschweifte Klammer zu }
Neue-Zeile-Zeichen.
Ablaufanweisungen
Mit den Ablaufanweisungen können Sie den Ablauf des awk-Programms steuern. Bei awk gibt es folgende Ablaufanweisungen:
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 Wert |
Die Ablaufanweisungen sind im Folgenden alphabetisch beschrieben.
break - Schleife abbrechen
break kann im Schleifenrumpf einer for-, while- oder do-Schleife verwendet werden. break bewirkt, dass die Schleife beendet wird.
Syntax
break
|
Beispiel
Solange ein Satz mit . beginnt, soll der nächste Satz eingelesen werden. Wenn das 2. Feld des eingelesenen Satzes größer als 1000 ist, soll abgebrochen werden.
{ while($1 ~ /^\./) { getline; if($2 > 1000) break; } }
continue - Rest eines Schleifendurchlaufs überspringen
continue kann im Schleifenrumpf einer for-, while- oder do-Schleife verwendet werden. continue bewirkt, dass der aktuelle Schleifendurchlauf beendet und mit dem nächsten Durchlauf weitergemacht wird.
Syntax
continue
|
Beispiel
Es sollen nur gerade Felder ausgegeben werden:
{ i=1; while(i++ <= NF) { if(i%2) continue; else print $i } }
do - Schleife
Mit der do-Schleife (oder do- while-Schleife) wird eine Anweisung wiederholt, solange eine Bedingung erfüllt ist. Im Gegensatz zur while-Schleife wird die Anweisung auf jeden Fall mindestens einmal ausgeführt.
Syntax
do anweisung while (ausdruck)
|
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst und durch Strichpunkt ; oder Neue-Zeile-Zeichen getrennt werden.
ausdruck
Ausdruck (siehe Ausdrücke), der die Bedingung angibt.
Beispiel
Die Felder eines Satzes sollen einzeln ausgegeben werden:
{ i=0; do {print $(++i)} while (i != NF) }
exit - awk-Programm beenden
Mit exit wird das awk-Programm beendet.
Wenn ein END-Teil vorhanden ist, dann führt awk noch die dort angegebene Abschluss-Aktion aus, ansonsten wird das Programm sofort beendet.
Syntax
exit
|
Beispiel
Wenn das Zeichen Klammeraffe in der Eingabe erscheint, soll das Ergebnis ausgegeben und die Bearbeitung beendet werden:
... /@/ {exit} ... END {print ergebnis}
for - Gezählte Wiederholung
Mit der for-Schleife wird eine Anweisung wiederholt, solange eine Bedingung erfüllt ist.
Syntax
for(ausdruck1; ausdruck2; ausdruck3) anweisung |
ausdruck1
Ausdruck (siehe Ausdrücke).
ausdruck1 wird einmal bei Start der for-Anweisung ausgewertet.
Beispiel: i=1
ausdruck2
Ausdruck (siehe Ausdrücke).
ausdruck2 wird vor jedem Schleifendurchgang ausgewertet. anweisung wird nur ausgeführt, falls ausdruck2 ungleich 0 (wahr) ergibt, ansonsten wird die Wiederholung beendet.
Beispiel:
i<10
ausdruck3
Ausdruck (siehe Ausdrücke).
ausdruck3 wird nach jedem Schleifendurchgang ausgewertet.
Beispiel:
i++
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern {} zusammengefasst werden.
Beispiel
Die Felder des aktuellen Satzes sollen in umgekehrter Reihenfolge ausgegeben werden.
{for(i=NF; i>0; i--) print $i}
for - Array-Durchlauf
Diese Form der for-Anweisung ist eine awk-Besonderheit zum Durchlaufen eines Arrays.
Syntax
for(index in array) anweisung |
index
Variable (siehe Grundelemente), die in unbestimmter Reihenfolge alle Elemente des Arrays array durchläuft. Der Index kann numerisch oder alphanumerisch sein.
array
Array, das durchlaufen wird.
anweisung
Anweisung, die für jedes Array-Element ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.
Beispiel
Das Array monate enthält für jeden Monat die Anzahl von Tagen. Ein Array-Element wird mit dem Monatsnamen indiziert, z.B.
monate["Januar"]=31.
Durch folgendes awk-Programm wird für jeden Monat der Monatsname und die Anzahl von Tagen ausgegeben.
$ awk ' BEGIN { monate["Januar"]=31; \ > monate["Februar"]=28; \ > monate["Maerz"]=31; \ > monate["April"]=30; \ > monate["Mai"]=31; \ > monate["Juni"]=30; \ > monate["Juli"]=31; \ > monate["August"]=31 } \ > END { for(i in monate) print "Monat",i,"hat",monate[i],"Tage" } ' Monat Mai hat 31 Tage Monat August hat 31 Tage Monat Juli hat 31 Tage Monat April hat 30 Tage Monat Juni hat 30 Tage Monat Januar hat 31 Tage Monat Maerz hat 31 Tage Monat Februar hat 28 Tage
if - Bedingte Anweisung
Bei der if-Anweisung wird eine Anweisung abhängig von einer Bedingung ausgeführt.
Syntax
if(ausdruck) anweisung1 [else anweisung2] |
ausdruck
Ausdruck (siehe Ausdrücke), der die Bedingung angibt. Wenn ausdruck ungleich 0 (wahr) ergibt, wird anweisung1 ausgeführt.
anweisung1
Anweisung, die ausgeführt wird, falls ausdruck wahr ist. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.
anweisung2
Anweisung, die ausgeführt wird, falls ausdruck falsch ist. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.
Beispiel
Wenn Feld 1 größer als 2 ist, dann sollen die Felder 2 und 3 ausgegeben werden, ansonsten die Felder 4 und 5:
{ if($1 > 2) print $2, $3; else print $4, $5 }
next - Mit dem nächsten Eingabesatz fortfahren
awk unterbricht die Bearbeitung des aktuellen Satzes; die Anweisungen, die next folgen, werden nicht ausgeführt. Dann liest awk den nächsten Eingabesatz ein. NR, NF, FNR, $0 und $1 bis $NF werden neu gesetzt.
Unterschied zur getline-Funktion:
getline macht den nächsten Satz zum aktuellen Satz; die Anweisungen, die getline folgen, werden mit den Werten des nächsten Satzes für die $-Variablen und für NR, NF und FNR ausgeführt.
Syntax
next
|
Beispiel
Sätze, die mit . beginnen, sollen ignoriert werden:
{ if ($1 ~/^\./) next }
while - Schleife
Mit der while-Schleife wird eine Anweisung wiederholt, solange eine Bedingung erfüllt ist.
Syntax
while(ausdruck) anweisung |
ausdruck
Ausdruck (siehe Ausdrücke), der die Bedingung angibt.
anweisung
Anweisung, die bei jedem Schleifendurchgang ausgeführt wird. Wenn mehrere Anweisungen ausgeführt werden sollen, müssen sie mit geschweiften Klammern { } zusammengefasst werden.
Beispiel
Alle Eingabefelder werden ausgegeben; jedes Feld wird in eine eigene Ausgabezeile geschrieben:
{ i = 1; while (i <= NF) { print $i i++ } }
Funktionen
awk stellt eine Reihe vordefinierter Funktionen zur Verfügung, bietet aber auch die Möglichkeit, eigene Funktionen zu definieren:
Syntax
function name(arg,...) {anweisungen}
|
Vor {anweisungen} darf ein Neue-Zeile-Zeichen stehen. Leerzeilen innerhalb der geschweiften Klammern {...} sind ebenfalls erlaubt. Eine Funktionsdefinition steht im Hauptteil eines awk-Programms gleichberechtigt neben auswahlbedingung {aktion}.
Funktionsaufrufe dürfen innerhalb eines Aktionsteils an beliebiger Stelle in einem Ausdruck stehen, nicht jedoch vor der Funktionsdefinition. Beim Aufruf darf zwischen dem Funktionsnamen und der öffnenden runden Klammer kein Leerzeichen stehen.
Funktionsaufrufe können geschachtelt werden, Funktionen dürfen rekursiv aufgerufen werden.
Bei den meisten Funktionen müssen Sie die Argumente nicht in Klammern einschließen. Klammern sind aber empfehlenswert, weil sie die Lesbarkeit verbessern. Übergeben Sie ein Array als Argument, dann wird ein Verweis auf das Array übergeben (call by reference) - Sie können aus der Funktion die Elemente des Arrays verändern. Bei skalaren Argumenten wird zur Übergabe der Wert der Variable kopiert (call by value) - Sie können den Wert er Variablen aus der Funktion heraus nicht ändern. Argumente haben einen lokal auf die Funktion beschränkten Geltungsbereich, während alle anderen Variablen immer einen globalen haben. Benötigen Sie lokale Variablen in einer Funktion, dann definieren Sie diese am Ende der Argumentliste in der Funktionsdefinition. Jede Variable der Argumentliste, für die kein aktuelles Argument existiert, ist eine lokale Variable, die mit dem Wert 0 vorbelegt ist.
Wie in C kann es Funktionen geben, die ein Ergebnis liefern (z.B. exp) und solche mit prozeduralem Charakter (z.B. Ausgabefunktionen).
Die Anweisung return kann mit oder ohne Wertangabe benutzt werden, oder ganz wegfallen - dann ist der Rückgabewert undefiniert, falls darauf zugegriffen werden sollte.
Beispiel
Die Funktion suche sucht in dem Array allenamen nach der Zeichenkette wer und gibt den Index oder -1 zurück. Dabei wird das 3. Argument lauf als lokale Variable verwendet.
... { print $1, suche($1, allenamen) } ... function suche(wer, allenamen, lauf) { for (lauf=0; allenamen[lauf]; lauf++) if (index(allenamen[lauf], wer) == 1 && length(allenamen[lauf]) == length(wer)) return lauf return -1 }
Vordefinierte Funktionen
Eingabefunktion | |
getline | Satz einlesen |
Ausgabefunktionen | |
print([arg,...]) | Standard-Ausgabefunktion |
printf(format [arg,...]) | Formatierte Ausgabe |
Arithmetische Funktionen | |
atan2(y,x) | Arcustangens von
y/x
|
cos(x) | Cosinus |
exp(x) | Exponentialfunktion |
int(x) | Ganzzahliger Anteil |
log(x) | Natürlicher Logarithmus |
rand() | Liefert eine Zufallszahl |
sin(x) | Sinus |
sqrt(x) | Quadratwurzel |
srand([x]) | Setzt den Anfangs-Berechnungswert für rand() |
Zeichenketten-Funktionen | |
gsub(re,repl[,in]) | Globale Substitutionsfunktion |
index(zk1,zk2) | Erstes Vorkommen einer Teilzeichenkette |
length([zk]) | Länge einer Zeichenkette |
match(zk,re) | Prüft, ob
zk
zum regulären Ausdruck
re
passt |
split(zk,array,[sep]) | Aufteilen einer Zeichenkette |
sprintf(format,e1,e2,...) | Formatierte Ausgabe in eine Variable |
sub(re, repl[,in]) | Substitutionsfunktion |
substr(zk,m,[n]) | Teilzeichenkette bestimmen |
tolower(s) | Umwandlung in Kleinbuchstaben |
toupper(s) | Umwandlung in Großbuchstaben |
Allgemeine Funktionen | |
close(expr) | Datei oder Pipe schließen |
system(expr) | Shell-Kommando aufrufen |
Die Funktionen sind im Folgenden alphabetisch beschrieben. Bei jeder Funktion ist angegeben, welche Argumente Sie angeben können: Sie können als Argument eine Konstante angeben oder einen Ausdruck (siehe Ausdrücke). awk wertet die Argument-Ausdrücke zuerst aus und wendet dann die Funktion auf die berechneten Ergebnisse an.
atan2 - Arcustangens
atan2 berechnet den Arcustangens des Quotienten zweier Zahlen: atan2(y,x) liefert den Arcustangens von y/x.
Syntax
atan2(y,x)
|
y,x
Zahlen, für deren Quotient der Arcustangens berechnet werden soll.
close - Datei oder Pipe schließen
close schließt die angegebene Datei bzw. Pipe.
Syntax
close(expr)
|
expr
Name der Datei oder der Pipe, die geschlossen werden soll (siehe bei der Beschreibung der Funktionen print und printf den Abschnitt über Ausgabeumlenkung).
cos - Cosinus
cos berechnet den Cosinus einer Zahl.
Syntax
cos(x)
|
x
Zahl, für die der Cosinus berechnet werden soll.
exp - Exponentialfunktion
exp berechnet e hoch x.
Syntax
exp(
x
)
|
x
Zahl, für die ex berechnet werden soll.
getline - Einen Satz einlesen
awk liest einen Satz ein (siehe next, Ablaufanweisung).
getline hat mehrere Formate. Die Formate von getline haben folgende Rückgabewerte:
1 | bei fehlerfreiem Lesevorgang |
0 | bei Dateiende |
-1 | bei einem Fehler |
Syntax
getline
|
awk liest in $0 den nächsten Eingabesatz aus der Eingabedatei ein. NR, NF, FNR, $0 und $1 bis $NF werden neu gesetzt.
Beispiel
Wenn ein Satz %%% enthält, wird der nächste Satz eingelesen, d.h. Eingabesätze, die %%% enthalten, werden ignoriert.
/%%%/ {getline}
Syntax
getline < datei |
awk liest in $0 einen Satz aus der Datei datei ein. NF, $0 und $1 bis $NF werden neu gesetzt.
datei
Name der Datei, aus der gelesen werden soll.
Syntax
getline var |
awk liest in die Variable var den nächsten Eingabesatz aus der Eingabedatei ein. NR und FNR werden neu gesetzt.
var
Variable, in die der nächste Satz eingelesen werden soll.
Syntax
getline var < datei |
awk liest in die Variable var einen Satz aus der Datei datei ein. NR, NF, FNR, $0 und $1 bis $NF werden nicht verändert.
var
Variable, in die der Satz eingelesen werden soll.
datei
Name der Datei, aus der gelesen werden soll.
Syntax
kommando | getline [var] |
Die Ausgabe des Kommandos kommando wird nach getline umgelenkt. Mit jedem getline-Aufruf in diesem Format liest awk in $0 bzw. var jeweils die nächste Zeile aus der Ausgabe von kommando ein.
Ist var angegeben, werden NR, NF, FNR, $0 und $1 bis $NF nicht verändert. Ist var nicht angegeben, werden NF, $0 und $1 bis $NF neu gesetzt.
Dieses Konstrukt wirkt wie der Aufruf der C-Funktion popen() mit Modus r.
var
Variable, in die der Satz eingelesen werden soll.
var nicht angegeben:
Der Satz wird in $0 eingelesen.
kommando
Name des Kommandos, aus dessen Ausgabe gelesen werden soll.
gsub - Globale Substitutionsfunktion
gsub ersetzt alle Zeichenketten in $0 bzw. in in, die zu dem erweiterten regulären Ausdruck re passen, durch die Zeichenkette repl.
gsub liefert die Anzahl der Ersetzungen zurück.
Syntax
gsub(
re,repl[,in]
)
|
re
Erweiterter regulärer Ausdruck, der als Muster für die Ersetzung dienen soll.
repl
Zeichenkette, die die zu re passenden Zeichenketten ersetzen soll.
in
Zeichenkette, in der die Ersetzung stattfinden soll.
in nicht angegeben:
Die Zeichenketten werden in $0 ersetzt.
index - Teilzeichenkette suchen
index sucht eine Teilzeichenkette in einer Zeichenkette. Wenn die Teilzeichenkette vorkommt, gibt index die Anfangsposition (in Zeichen, nummeriert ab 1) des ersten Vorkommens zurück. Wenn die Teilzeichenkette nicht vorkommt, gibt index 0 zurück.
Syntax
index(
zk1,zk1
)
|
zk1
Zeichenkette, in der index die Teilzeichenkette sucht.
zk2
Teilzeichenkette, die index sucht.
Beispiel
Vergleich der Zeichenketten „ToTo-LoTo“ mit „To“
index("ToTo-LoTo","To") ist 1.
int - Ganzzahliger Anteil
int gibt die größte ganze Zahl zurück, die kleiner oder gleich dem Argument ist.
Syntax
int(
x
)
|
x
Zahl, deren ganzzahliger Anteil bestimmt werden soll.
length - Länge bestimmen
length bestimmt die Länge einer Zeichenkette.
Syntax
lenght[(
zk
)] |
zk
length bestimmt die Länge der Zeichenkette zk.
zk nicht angegeben:
length bestimmt die Länge des aktuellen Eingabesatzes $0.
log - Logarithmus
log berechnet den natürlichen Logarithmus zur Basis e.
Syntax
log(
x
)
|
x
Zahl, für die der natürliche Logarithmus berechnet werden soll.
match - Prüffunktion für reguläre Ausdrücke
match prüft, ob eine Zeichenkette in zk zu dem erweiterten regulären Ausdruck re passt. match liefert die Stelle in zk (in Zeichen, nummeriert ab 1) zurück, an der die zu re passende Zeichenkette anfängt; wenn keine Zeichenkette in zk passt, liefert match 0 zurück.
Die Variable RSTART wird auf den Return-Wert von match gesetzt. Die Variable RLENGTH wird auf die Länge der passenden Zeichenkette gesetzt bzw. auf -1, falls keine Zeichenkette passt.
Syntax
match(
zk,re
)
|
zk
Zeichenkette, in der die Mustersuche stattfinden soll.
re
Erweiterter regulärer Ausdruck.
print - Standard-Ausgabefunktion
print ist die Standard-Ausgabefunktion. print gibt entweder den aktuellen Satz oder die angegebenen Argumente aus und schließt die Ausgabe mit dem Ausgabesatztrenner ORS (ORS - Output Record Separator) ab. Nähere Beschreibung des Ausgabeformats siehe "Ausgabeformat".
Syntax
print(
arg1[[,]arg2 ...]
)[umlenkung] |
Kein Argument angegeben:
print gibt den aktuellen Eingabesatz auf die Standard-Ausgabe aus.
arg1arg2
Argumente, die ausgegeben werden sollen. print wertet die Argument-Ausdrücke aus und hängt die Ergebnisse in der Reihenfolge der Argumente hintereinander.
arg1,arg2
Argumente, die ausgegeben werden sollen. print gibt die ausgewerteten Argument-Ausdrücke in der angegebenen Reihenfolge aus und trennt sie durch den Ausgabe-Feldtrenner OFS (OFS - Output Field Separator), sofern sie durch Kommata getrennt in der print-Anweisung stehen.
umlenkung
Sie können die Ausgabe in eine Datei umlenken oder an ein Programm weiterreichen. Maximal können Sie 10 Ausgabedateien verwenden.
umlenkung kann sein:
>datei
Die Ausgabe wird in die Datei datei geschrieben. Der alte Inhalt von datei wird beim ersten print-Aufruf gelöscht. Alle weiteren print- oder printf-Ausgaben auf datei in demselben awk-Programm werden angehängt. datei bleibt bis zum Ende des awk-Programms geöffnet, falls sie nicht explizit geschlossen wird.
>>datei
Die Ausgabe wird an den bisherigen Inhalt der Datei datei angehängt. datei bleibt bis
zum Ende des awk-Programms geöffnet, falls sie nicht explizit geschlossen wird.
|prog
Die Ausgabe wird über eine Pipe an das Programm prog geschickt.
Sie dürfen innerhalb eines awk-Programms nur eine Pipe zu prog öffnen. Auf diese Pipe können mehrere print- oder printf-Ausgaben erfolgen.
Dieses Konstrukt wirkt wie der Aufruf der C-Funktion popen() [4] mit Modus w.
Die Pipe bleibt bis zum Ende des awk-Programms geöffnet, falls sie nicht explizit geschlossen wird.
Den Dateinamen bzw. Programmnamen können Sie direkt angeben, eingeschlossen in "...", oder durch eine Variable, die den Dateinamen enthält.
Achtung!
Wenn Sie auf die Eingabedatei umlenken, wird die Eingabedatei ohne Warnung zerstört!
Ausgabeformat
print gibt ganze Zahlen dezimal aus und Zeichenketten in ihrer vollen Länge. Ansonsten ist das Ausgabeformat durch folgende vordefinierte Variablen festgelegt:
OFS - Ausgabe-Feldtrenner
OFS ist standardmäßig ein Leerzeichen. Sie können OFS ein beliebiges Zeichen zuweisen und damit den Ausgabe-Feldtrenner ändern.
ORS - Ausgabe-Satztrenner
ORS ist standardmäßig das Neue-Zeile-Zeichen. Sie können ORS ein beliebiges Zeichen zuweisen und damit den Ausgabe-Satztrenner ändern.
OFMT - Gleitkomma-Ausgabeformat
(OFMT - output format) OFMT enthält das Ausgabeformat für Gleitkommawerte. OFMT ist standardmäßig "%.6g". Das bedeutet, dass Gleitkommazahlen mit maximal 6 Stellen hinter dem Dezimalpunkt ausgegeben werden. Sie können OFMT ein anderes printf-Format für Gleitkommazahlen zuweisen (siehe printf - Formatierte Ausgabe).
Beispiel
Erstes und zweites Feld, getrennt durch Leerzeichen, ausgeben:
{print $1,$2}
Erstes und zweites Feld ohne Ausgabe-Feldtrenner aneinanderhängen:
{print $1$2}
oder
{print $1 $2}
printf - Formatierte Ausgabe
printf ist die Ausgabefunktion für formatierte Ausgabe. Sie können das Ausgabeformat wie bei der Standard-C-Funktion printf() angeben.
Syntax
printf(format, arg,...]
)[umlenkung] |
format
Zeichenkette, die das Ausgabeformat enthält. Das Ausgabeformat besteht aus Zeichen und Formatangaben. Die darstellbaren Zeichen werden unverändert ausgegeben. Die im Abschnitt Grundelemente angegebenen Sonderzeichen werden gleich umgesetzt.
So wird z.B. durch \n auf den Anfang der nächten Zeile positioniert.
Eine Formatangabe wird mit dem Prozent-Zeichen % eingeleitet. Die wichtigsten Formatelemente sind in der folgenden Liste zusammengestellt.
%c | Einzelnes Zeichen |
%d | Ganzzahl dezimal |
%e | Gleitkommazahl in Exponent-Darstellung, z.B. 5.234e+2 |
%f | Gleitkommazahl, z.B. 52.34 |
%g | %e oder %f, je nachdem, welche Darstellung kürzer ist |
%o | Ganzzahl oktal (Basis 8) |
%s | Zeichenkette |
%u | Ganzzahl dezimal ohne Vorzeichen |
%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 formatiert aus.
Wenn Formatangabe und Argument nicht zusammenpassen (Formatangabe numerisch, Argument alphanumerisch), wird 0 ausgegeben.
Wenn mehr Argumente vorhanden sind als Formatangaben, werden die überzähligen Argumente ignoriert, d.h. nicht ausgegeben.
Wenn mehr Formatangaben vorhanden sind als Argumente, wird eine Fehlermeldung ausgegeben.
umlenkung
Bezüglich Umlenkung gilt dasselbe wie bei print.
umlenkung nicht angegeben:
printf gibt auf die Standard-Ausgabe aus.
Beispiel
Feld 1 wird als Dezimalzahl mit mindestens 2 Stellen ausgegeben, danach, getrennt durch **, Feld 2 als Zeichenkette mit mindestens 5 Zeichen und danach Neue Zeile:
{ printf("%2d**%5s\n", $1,$2) }
rand - Zufallszahl liefern
rand liefert eine Zufallszahl r zurück, für die gilt: 0 <= r < 1.
Syntax
rand
|
Siehe auch srand.
sin - Sinus
sin liefert den Sinus einer Zahl.
Syntax
sin(x)
|
x
Zahl, deren Sinus berechnet werden soll.
split - Zeichenkette aufteilen
split teilt eine Zeichenkette in Teilzeichenketten auf und speichert die Teilzeichenkette als Elemente eines Arrays ab. Die Array-Elemente werden beginnend mit 1 aufsteigend indiziert.
split liefert die Anzahl der Elemente des Arrays zurück.
Syntax
split(zk,array[,sep])
|
zk
Zeichenkette, die aufgeteilt werden soll.
array
Name des Ergebnis-Arrays.
sep
Erweiterter regulärer Ausdruck, der die Zeichen bestimmt, die in zk als Trennzeichen
zwischen den Teilzeichenketten gelten sollen.
sep nicht angegeben:
FS gilt als Trennzeichen.
Beispiel
Die Eingabe
{ s=split("januar:februar:maerz", monate, ":"); for(i=1; i<s; i++) print monate[i]; }
erzeugt die Ausgabe:
januar februar maerz
sprintf - Formatierte Ausgabe in Zeichenkette
Bei sprintf ist die Formatierung wie bei printf. Es erfolgt aber keine Ausgabe. Stattdessen gibt sprintf die formatierte Ausgabe als Ergebnis-Zeichenkette zurück. Diese Zeichenkette können Sie z.B. einer Variablen zuweisen.
Syntax
sprintf(format,arg,...)
|
format
Zeichenkette, die das Ausgabeformat enthält (siehe Formatierte Ausgabe).
arg
Argumente, die ausgegeben werden sollen (siehe Formatierte Ausgabe).
Beispiel
Das folgende awk-Programmstück erzeugt diesselbe Ausgabe wie das Beispiel bei printf.
{ x = sprintf("%2d**%5s\n", $1,$2); print x }
sqrt - Quadratwurzel berechnen
sqrt berechnet die Quadratwurzel zu einer Zahl.
Syntax
sqrt(x)
|
x
Zahl, deren Quadratwurzel berechnet werden soll.
srand - Anfangs-Berechnungswert für die Funktion rand setzen
srand setzt den Anfangs-Berechnungswert für die Funktion rand auf die Zahl x bzw. auf die aktuelle Uhrzeit, falls kein Argument angegeben ist.
Syntax
srand([x])
|
x
Zahl, die als Anfangs-Berechnungswert für rand dienen soll.
sub - Globale Substitutionsfunktion
sub ersetzt die erste Zeichenkette in $0 bzw. in in, die zu dem erweiterten regulären Ausdruck re passt, durch die Zeichenkette repl.
sub liefert die Anzahl der Ersetzungen zurück.
Syntax
sub(re,repl[,in])
|
re
Erweiterter regulärer Ausdruck, der als Muster für die Ersetzung dienen soll.
repl
Zeichenkette, die die zu re passenden Zeichenketten ersetzen soll.
in
Zeichenkette, in der die Ersetzung stattfinden soll.
in nicht angegeben:
Die Zeichenketten werden in $0 ersetzt.
substr - Teilzeichenkette bestimmen
substr liefert eine Teilzeichenkette einer Zeichenkette.
Syntax
substr(zk,m[,n])
|
zk
Zeichenkette, aus der eine Teilzeichenkette ausgewählt werden soll.
m
n
Maximale Länge der Teilzeichenkette.
n nicht angegeben:
Die Teilzeichenkette geht bis zum Ende von zk.
Beispiel
Die Eingabe
{ x = substr("060795",3,2); print "Monat = "x }
erzeugt die Ausgabe:
Monat = 07
system - Shell-Kommando ausführen
system führt das angegebene Shell-Kommando aus und liefert den Ende-Status des Kommandos zurück.
Syntax
system(kommando)
|
kommando
Name des Shell-Kommandos, das ausgeführt werden soll.
Fehler
Wenn das awk-Programm fehlerhaft ist, gibt awk Fehlermeldungen aus und beendet sich sofort. Die Fehlermeldungen enthalten die Fehlerursache, falls awk diese erkennt, sowie die Zeile des awk-Programms, in der awk den Fehler vermutet.
Typische Fehlermeldungen sind:
awk: syntax error at source line xxx
In der Zeile xxx des awk-Programms liegt ein Syntaxfehler vor.
awk: illegal statement source line number xxx
In der Zeile xxx des awk-Programms steht eine falsche Anweisung
Internationale Umgebung
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos awk:
LANG
Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind.
Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.
LC_ALL
Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.
LC_COLLATE
Legt in geklammerten regulären Ausdrücken die Bedeutung von Zeichenbereichen, Äquivalenzklassen und Zeicheneinheiten fest, während LC_C TYPE die Bedeutung von Zeichenklassen festlegt. LC_COLLATE bestimmt das Verhalten von Vergleichsoperatoren beim Vergleich von Zeichenketten.
LC_CTYPE
Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten).
LC_MESSAGES
Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.
LC_NUMERIC
Legt die Darstellung von Dezimalpunkt, Exponentzeichen und Tausendertrennzeichen fest.
NLSPATH
Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.
PATH
Legt den Suchpfad fest, wenn ein Kommando durch system(kommando), Ein- oder Ausgabepipes ausgeführt werden soll.
Beispiele zu awk
Beispiel 1
Sie wollen alle Eingabezeilen ausgeben, bei denen Feld 3 größer ist als Feld 5:
$ awk '$3 > $5' datei
Da keine Aktion angegeben ist, gibt awk standardmäßig die ausgewählten Zeilen aus.
Beispiel 2
Sie wollen jede 10. Zeile der Datei datei ausgeben:
$ awk '(NR % 10) == 0' datei
Beispiel 3
Sie wollen für jede Zeile das vorletzte und letzte Feld, getrennt durch Doppelpunkt, ausgeben:
$ awk 'BEGIN {OFS=":"} \
> {print $(NF-1), $NF}' datei
Bei Zeilen, die aus einem einzigen Feld bestehen, wird die ganze Zeile zweimal, getrennt durch Doppelpunkt, ausgegeben (zuerst $0, dann $1).
Beispiel 4
Sie wollen die Werte des ersten Feldes von allen Zeilen addieren. Zum Schluss sollen Summe und Mittelwert ausgegeben werden.
$ awk '{s += $1} \
> END {print "Summe: ", s, "Mittelwert: ", s/NR}'\
> datei
Beispiel 5
Präprozessor-if-Anweisung heraussuchen, d.h. einen Bereich auswählen, dessen erste Zeile mit #if und dessen letzte Zeile mit #endif beginnt:
$ awk '/^#if/, /^#endif/' datei
Beispiel 6
Sie wollen alle Zeilen ausgeben, deren erstes Feld sich von dem ersten Feld der vorhergehenden Zeile unterscheidet:
$ awk '$1 != vorher { print; vorher = $1 }' datei
Beispiel 7
datei enthält eine Tabelle mit Daten über Jugendliche. In dem zweiten Feld steht entweder Schueler, Student, Lehrling oder Sonstige. Für eine Statistik sollen Schüler und Studenten gezählt werden:
$ awk '$2 ~ /Schueler/ {haeuf["Schueler"]++} \
> $2 ~ /Student/ {haeuf["Student"]++} \
> END {print "Schueler:" haeuf["Schueler"]; \
> print "Student:" haeuf["Student"]} ' datei
Beispiel 8
In der Datei inhalt steht ein mit Dezimalklassifikation gegliedertes Inhaltsverzeichnis eines Textes.
Die Liste hat folgendes Format:
1. Vorwort 2. Einleitung 3. Das Schachspiel 3.1. Geschichte 3.2. Regeln 3.2.1 Aufstellen der Figuren . . . 4. Das Damespiel 4.1. Geschichte . . . 8. Register
Mit folgendem awk-Programm bringen Sie diese Liste in ein übersichtlicheres Format.
$ awk '{$1=$1"
";
\
> $1=substr($1,1,6);
\
> print $0}' inhalt
>> inh.form
Die Aufbereitung der Ausgabezeilen erfolgt in folgenden Schritten: Zuerst werden an das erste Feld sechs Leerzeichen angehängt (
$1=$1" "
). Dann wird das erste Feld auf Länge sechs gekürzt. Damit ist in jeder Zeile das erste Feld 6 Zeichen lang und Feld 2 beginnt immer auf Spalte sieben. Sie erhalten folgende Ausgabe in der Datei inh.form:
1. Vorwort 2. Einleitung 3. Das Schachspiel 3.1. Geschichte 3.2. Regeln 3.2.1 Aufstellen der Figuren . . . 4. Das Damespiel 4.1. Geschichte . . . 8. Register
Beispiel 9
Das folgende awk-Programm in der Datei prog gibt für jeden Satz die Feldanzahl und die Felder aus. Der Satztrenner wird auf das Dollarzeichen $ umdefiniert. Feldtrenner sind daher Leer-, Tabulator- und Neue-Zeile-Zeichen:
BEGIN { RS="$"; printf "Satz\tAnz" } { printf ("\n%4d\t%3d\t", NR, NF); for(i=1; i<=NF; i++) printf "%s:", $i } END {print"\n"}
Die Datei text enthält folgenden Text:
erster Satz$ zweiter Satz $ $ vierter und letzter Satz$
Der Aufruf:
$ awk -f prog text
liefert:
Satz Anz 1 2 erster:Satz: 2 2 zweiter:Satz: 3 0 4 4 vierter:und:letzter:Satz: 5 0
Beispiel 10
Sie ändern die Datei text wie folgt:
&& erster&&Satz$zweiter Satz$$vierter und& letzter Satz&
und rufen awk auf, dieses Mal mit der Option -F , um den Feldtrenner auf & zu ändern.
$ awk -F"&" -f prog text
Die Ausgabe ergibt:
Satz Anz 1 6 :::erster::Satz: 2 1 zweiter Satz: 3 0 4 8 vierter:und::letzter::Satz:::
Dieses Beispiel verdeutlicht die Feldeinteilung bei einem Nicht-Standard-Feldtrenner. Die erste Zeile (&&) der Datei text ist Teil des ersten Satzes und ergibt z.B. 3 Felder, weil bei einer Folge von Trennern jeder Trenner zählt und Neue Zeile implizit auch als Trenner gilt (2 & + 1 Neue Zeile = 3).
Siehe auch
egrep , fgrep , grep , lex, sed