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
|