UNIX-Tool awk


awk ist ein Werkzeug, das aus einem Datenstrom Zeilen und Spalten selektieren kann. Zum Selektieren der Zeilen arbeitet es vergleichbar mit grep. Eine Spalte wird aus Sicht des awk durch Leer- oder Tabulatorzeichen abgetrennt.

Das Apostroph

Im Allgemeinen bestehen die Argumente von awk aus mehr als einem Wort. Da die Shell durch Leerzeichen getrennte Eingaben dem Programm separat übergibt, wird ein Argument, das aus mehreren Worten besteht in Anführungszeichen oder meist Apstrophe eingeschlossen. Diese sind auch hilfreich, wenn das Kommando über mehrere Zeilen geht, da die Shell den Befehl erst als abgeschlossen ansieht, wenn das zweite Apostroph erscheint.

Selektion: Auswahl von Zeilen

Das Kommando zur Selektion wird gegeben, indem der Suchstring in Schrägstriche gesetzt wird.

awk /Otto/ telefon

Alle Zeilen mit der Zeichfolge Otto in der Datei telefon werden ausgegeben. Wird kein Suchstring angegeben, werden alle Zeilen angezeigt.

Projektion: Auswahl von Spalten

Zur Projektion muß die Spalte angegeben werden und ein Kommando, was mit ihr passieren soll. Als Spaltentrenner gelten jede beliebige Kombination von Tabs oder Leerzeichen. Das einfachste Kommando ist die Ausgabe mittels print. Die Spalte wird durch deren Nummer und ein vorgestelltes Dollarzeichen bezeichnet. Die Zählung beginnt bei 1. $0 bezeichnet die gesamte Zeile! Aktionen werden immer in gescheifte Klammern gesetzt.

So kann die dritte Spalte einer Datei wie folgt ausgegeben werden:

awk '{print $3}'

Die Spaltentrenner werden nicht mit zugegriffen.

Kombination von Kommandos

Es ist möglich, mehrere Befehle in einer geschweiften Klammer zu setzen. Dabei sind die Kommandos durch ein Semikolon zu trennen.

Die Kombination beider Optionen ist möglich. So würde das Kommando

awk '/Otto/ {print $3}' telefon

für alle Zeilen der Datei telefon, in denen die Zeichenfolge Otto steht, die dritte Spalte ausgeben.

Variablen

Innerhalb des awk-Kommandos können Variablen verwendet werden. Diese sind lokal für awk. In diesen können z. B. Summen gebildet werden. Eine Deklaration ist nicht erforderlich.

Start-, Standard- und Endanweisungen

Man kann drei Typen von Anweisungen unterscheiden. Die Standardanweisung kennen wir bereits. Sie wird auf jede selektierte Zeile angewandt. Daneben gibt es noch die Startanweisung, die genau einmal vor der ersten Verarbeitung ausgefuehrt wird und das Schlüsselwort BEGIN vorstellt. Die Endanweisung wird durch das Schlüsselwort END eingeleitet.

awk 'BEGIN{print"Hallo"}
     {print $3}
     END{print "Das wars"}' Datei

In Verbindung mit Variablen kann die END-Anweisung benutzt werden, um Summen oder andere Auswertungen zu fahren.

Beispiel: Summe aller Dateilängen mit der Endung gnt bilden:

Man gibt in der ersten Zeile das Kommando, um ein Verzeichnis anzusehen. Das Ergebnis wird dem awk per pipe zugeschoben. In der Standardanweisung wird eine Variable um den Wert in der fünften Spalte erhöht. Die Endanweisung gibt diese Variable aus.

ls -l *.gnt | awk '{sum+=$5}END{print sum}'

Die Suche nach gnt könnte natürlich auch von awk uebernommen werden. Z. B. hiesse der Befehl dann

ls -l  | awk '/gnt/ {sum+=$5} END{print sum}'

Der Unterschied liegt in diesem Falle darin, daß Zeilen, in denen irgendwo gnt (z. B. im Gruppennamen) vorkommt, auch mitgerechnet werden.

Standardvariablen

Einige Variablen sind im awk vorbesetzt:


NR Nummer der aktuell bearbeiteten Zeile
NF Anzahl der Felder in der aktuellen Zeile
RS Trennzeichen zwischen Zeilen/Records
ORS Trennzeichen zwischen Zeilen fuer die Ausgabe
FS Feldseparator
OFS Feldseparator für die Ausgabe

Eingebaute Funktionen

Funktion Wirkung
print Anzeigen
printf Entspricht der C-Funktion printf
sprintf für Speicherung von Ausgaben in einer Variablen
length(s) ermittelt die Länge einer Zeichenkette
substr(s, anf, anz) Teilstringbildung
index(s, t) gibt die Stelle an, an der in s die Zeichenkette t beginnt
sqrt(n) Wurzel
log(n) natürlicher Logarithmus
exp(n) ex
int(n) ganzzahliger Anteil

Ausführung von Programmdateien

Mit den Variablen und Befehlen sind komplexe Programme zu erzeugen. Damit diese nicht jedesmal neu eingegeben werden muessen, kann man Dateien mit den auszuführenden Aktionen schreiben. Diese sind dann mit der Flag -f statt des Kommandos aufzurufen.

awk -f Befehle Datei

In der Datei Befehle stehen die Befehle für awk


Homepage (C) Copyright 1999 Arnold Willemer