[ awk-Tutorium ]

 

Kapitel 5

Für Fortgeschrittene

 

5.1    Reguläre Ausdrücke - die ganze Wahrheit

In Kapitel 2 haben wir bereits einige reguläre Ausdrücke kennengelernt. Dies sind die am häufigsten verwendeten, aber das Konzept des regulären Ausdrucks reicht noch viel weiter:

Ein regulärer Ausdruck besteht aus einem oder mehreren »Zweigen«, die voneinander durch | abgetrennt sind. Der Ausdruck wird gefunden, wenn einer der Zweige gefunden wird (Oder-Verknüpfung):

/groß|mittel|klein/ wird in »Der kleine Gernegroß« gefunden. Der erste Treffer ist »groß«, obwohl »klein« zuerst auftaucht: Links stehende Zweige haben ein stärkeres Gewicht. (Das ist wichtig, wenn die Position des ersten Treffers ausgegeben wird, wie z.B. in match.)

Ein Zweig besteht aus mehreren »Stücken«, die einfach aneiandergereiht werden. Damit ein Zweig gefunden wird, müssen alle Stücke hintereinander im String gefunden werden.

Ein Stück ist ein »Atom«, dem eines der Zeichen *, + oder ? nachfolgen kann. Die Bedeutung der Zeichen wird gleich erklärt.

Ein Atom ist ein regulärer Ausdruck in runden Klammern oder einer der Ausdrücke, die wir bereits kennen: Ein einzelner Buchstabe, ein Backslash mit einem nachfolgenden Buchstaben, die Wildcard ., ein Bereich in [], der Zeilenanfang ^ oder das Zeilenende $.

Ein Atom ohne nachgestelltes Zeichen findet exakt ein Vorkommnis des Atoms: /ein/ findet »einer«, »Bein« und »Schweinebacke«.

Ein Atom mit nachgestelltem * findet kein oder beliebig viele Vorkommnisse des Atoms. /14*5/ findet »15«, »145«, »1445«, »14445« usw.

Ein Atom mit nachgestelltem + findet ein oder mehrere Vorkommnisse des Atoms: /14+5/ findet »145«, »14445«, aber nicht »15«.

Ein Atom mit nachgestelltem ? findet das Atom selbst oder den leeren String, d.h. nichts: /14?5/ findet »15« und »145«, mehr nicht.

Wenn es mehrere Treffer gibt, so wird der im Suchstring zuerst auftretende gewählt. Bei Ausdrücken mit *, + und ? wird der Treffer gewählt, in dem die meisten Wiederholungen eines Atoms auftauchen (longest match).

Die Anwendung regulärer Ausdrücke ist oft hilfreich, kann aber auch zu Extremen wie

    /-?[0-9]*(\.[0-9]*)?([eE][+-]?[0-9]+)?/

geführt werden. (Der Ausdruck findet übrigens eine Dezimalzahl in Exponentenschreibweise.) Für die meisten Anwendungen sind die Atome jedoch ausreichend, insbesondere dann, wenn man nicht die genaue Position des Auftretens eines regulären Ausdrucks benötigt.

 

5.2    Weitere Variablen in awk

Neben den bekannten $[x], NR, NF gibt es noch weitere Variablen in awk:

FILENAME ist der Name der momentan geöffneten Datei. Das kann hilfreich sein, wenn mehrere Dateien mit awk bearbeitet werden sollen. FILENAME ist in den Blöcken BEGIN und END nicht definiert.

ARGC (argument count) ist die Anzahl der aus der Shell übergebenen Argumente. Der Aufruf von awk zählt dabei als Argument. ARGV (argument value) ist ein Feld, das die übergebenen Argumente als String enthält. ARGV[0] ist "awk" (oder welche Version von awk benutzt wurde), ARGV[1] bis ARGV[ARGC-1] die übergebenen Dateien.

ENVIRON ist ein Feld, das die Umgebungsvariablen des Systems als Strings enthält. Der Index ist der Name der Umgebungsvariable als String: ENVIRON["DISPLAY"] enthält das momentane Display-Setting.

FNR (file number of records) ist die Zeilennummer in der momentanen Datei. NR wird dateiübergreifend gezählt.

RS (record separator) ist das Zeichen, das Zeilen voneinander trennt. Die Voreinstellung ist hier "\n", das newline-Zeichen, was bedeutet, das Zeilen in awk auch normalen Zeilen entsprechen. Man könnte aber z.B. mit RS = ";" Zeilen auch durch Semikola trennen.

FS (field separator) ist der reguläre Ausdruck, der die einzelnen Wörter voneinander trennt. Die Voreinstellung ist, dass Tabulatoren und Leerzeichen die Wörter trennen. Achtung: Wird FS im Skript definiert, so werden Zeichen am Anfang und am Ende berücksichtigt. Fängt eine Zeile dann mit einem der Trennzeichen an, so ist das erste Wort der leere String, der als Wort zwischen Zeilenanfang und dem ersten Auftreten des Separators gewertet wird!

ORS (output record separator) ist das Zeichen, das nach jedem print-Befehl geschrieben wird, per Default ein Zeilenumbruch mit newline ("\n").

OFS (output field separator) ist das Zeichen, das zwischen zwei Ausgabeargumenten von print geschrieben wird, per Default ein Leerzeichen.

OFMT (output format) ist das Ausgabeformat für Zahlen, wenn kein anderes angegeben wird. Voreinstellung ist hier "%.6g".

Aufgaben:

Aufgabe 5a
Schreibe ein Skript, das ein HTML-Dokument lesbar macht: Alle Ausdrücke zwischen spitzen Klammern sollen gestrichen werden. (Gehen wir einmal davon aus, dass eine spitze Klammer immer auf derselben Zeile geschlossen wird.)


Nächstes Kapitel
Voriges Kapitel
nach oben
Inhalt


________
Startseite --> Dies & das --> awk-Tutorium --> Kapitel 5
Ü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