[ awk-Tutorium ]

 

Kapitel 1

Erste Schritte

 

1.1    Was ist awk?

awk ist ein Werkzeug zum Bearbeiten von strukturierten Texten, wie z.B. Datensätzen für FE-Programme. Es bietet Such- und Ersetzungsfunktionen, formatiertes und unformatiertes Einlesen und Herausschreiben und eine mächtige Skriptsprache. All diese Dinge können je nach Gusto und Anforderungen des Benutzers beliebig einfach oder kompliziert gehalten werden.

awk-Skripte können auf verschiedene Weise aufgerufen werden:

i) Aus der Shell heraus:

    cmd> awk '[script]' [textdatei]

[script] ist das Skript, das mit Hochkommas von der Shell geschützt wird. Die Hochkommas bewirken, dass das Skript als ein »Wort« in der Shell betrachtet wird. wird.

[textdatei] ist die zu lesende Datei. Es können mehrere Dateien angegeben werden, die dann nacheinander abgearbeitet werden. Wird keine Datei angegeben, so erfolgt das Einlesen über stdin.

Die Ausgabe erfolgt über stdout und kann mit > in eine andere Textdatei umgelenkt werden.

ii) Als separates Skript

    cmd> awk -f [script] [textdatei]

Hier wird das Skript nicht auf der Kommandozeile angegeben, sondern steht in einer separaten Datei [script]. Dieses Vorgehen bietet sich insbesondere für längere Skripte an.

Die Shell ermöglicht es, den awk-Aufruf direkt in den Kopf der Skriptdatei zu schreiben. Steht in der ersten Zeile des Skripts

    #!/bin/awk -f

so kann die Skriptdatei direkt mit Namen aufgerufen werden. Die Skriptdatei muss dann für den Benutzer ausführbar und lesbar sein (r-x oder oktal 5). Außerdem wurde hier angenommen, dass sich awk unter /bin/ befindet. Wer Zweifel hat, wo sein awk liegt, sagt which awk.

 

1.2    Wie arbeitet awk?

awk liest die Daten zeilenweise aus der angegebenen Textdatei ein. In jeder Zeile wird das Skript ausgeführt. Die Anweisungen im Skript haben dabei die Form

    [Bedingung] { [Anweisung(en)] }

Ist die [Bedingung] erfüllt, so werden die [Anweisungen] in den geschweiften Klammern ausgeführt. Fehlt die Bedingung, so werden die Anweisungen für jede Zeile ausgeführt. Fehlt der Anweisungsteil in geschweiften Klammern, so wird die Zeile, die die Bedingung erfüllt, einfach ausgegeben.

Eine typische Anweisung ist print, das einfach die eigelesene Zeile ausgibt. Wie oben beschrieben, kann { print } einfach weggelassen werden.

Ein Beispiel für eine typische Bedingung ist /[text]/. Diese Bedingung ist wahr, wenn der String [text] im der eingelesenen Zeile auftaucht.

Unser erstes awk-Skript soll einfach alle Zeilen der Datei xyz.dat ausgeben, die das Wort »NODE« enthalten:

    awk '/NODE/ { print }' xyz.dat

Da { print } weggelassen werden kann, kann man dies verkürzen zu

    awk '/NODE/' xyz.dat

Dieses awk-Skript ist natürlich äqivalent zum Shell-Befehl

    grep 'NODE' xyz.dat

Das noch viel einfachere

    awk '{ print }' xyz.dat

ist dasselbe wie

    cat xyz.dat

wobei hier { print } nicht ausgelassen werden kann, da sonst das Skript leer wäre, was awk interpretiert als »mache gar nichts«.

 

1.3    awk findet Wörter

Wenn awk eine Zeile einliest, so schreibt es sie auf die Variable $0. Außerdem teilt awk die Zeile automatisch in Wörter (oder »Felder«) auf, die $1, $2, $3 usw. heißen. Ein Wort ist dabei alles, was zwischen zwei Leerzeichen steht.

Weiterhin werden folgende Variablen belegt: NF (Number of Fields) ist die Anzahl der Wörter, in die die Zeile aufgeteilt wurde. NR (Number of Records) ist die Zeilennummer der momentan eingelesenen Zeile. Eine Zeile wird in awk oft als Record, Eintrag, bezeichnet.

   awk berücksichtigt Groß- und Kleinschreibung. So ist NF die Anzahl der Felder; nf, Nf und nF sind es nicht.

Wenn die Zeile also

    (Fischers Fritz fischt frische Fische.)

heißt, so ist NF fünf. Satzzeichen gehören zu den Wörtern, deshalb heißt das letzte Wort "Fische.)", nicht bloß "Fische". awk hat also keine menschlichen Lesegewohnheiten.

Das Skript

    awk '{print $NF}' xyz.dat

schreibt übrigens das letzte Wort jeder Zeile heraus. An diesem Skript kann man sehen, dass nach dem Dollar anstelle einer Zahl auch eine Variable stehen kann, und dass print nicht nur alleine stehen kann, sondern konkret angegeben werden kann, was ausgegeben werden soll. print ohne alles ist also nur eine Abkürzung für print $0.

Aufgaben:

Aufgabe 1a
Schreibe ein Skript, das die beiden ersten Wörter einer Zeile in umgekehrter Reihenfolge ausgibt.

Aufgabe 1b
Schreibe ein Skript, das alle Zeilen einer Datei ausgibt und dabei die Zeilennummer vor eine Zeile schreibt.


Nächstes Kapitel
Voriges Kapitel
nach oben
Inhalt


________
Startseite --> Dies & das --> awk-Tutorium --> Kapitel 1
Übersicht
Martin Oehm

[ www.martin-oehm.de - Startseite ]
[ Dies & das ]
[ awk-Tutorium ]

Inhalt

Vorwort

1. Kapitel
2. Kapitel
3. Kapitel
4. Kapitel
5. Kapitel

Kurzübersicht
Lösungen