Awk: Grundlagen: Reguläre Ausdrücke
Simple reguläre Ausdrücke
BearbeitenEin einfacher String oder ein Zeichen kann bereits einen regulären Ausdruck darstellen.
Beispiel: Wir wollen in der personendatenbank.txt alle Datensätze, die den Buchstaben i beinhalten, vollständig ausgeben.
awk-Skript:
/i/
Ausgabe:
Mimi P 13.08.2005 Susi T 23.09.1999 Fritz X 03.03.2001
Erläuterung: Das awk-Skript besteht nur aus einer Bedingung, einem geklammerten regulären Ausdruck. Der Ausdruck /i/ entspricht der Bedingung $0~/i/. Das Zeichen ~ steht für beinhaltet.
Beispiel: Alle Datensätze, welche den Vornamen Mimi aufweisen sollen ausgegeben werden.
awk-Skript':
$1=="Mimi"
Beliebige Zeichen
BearbeitenEin beliebiges Zeichen in einem Regulären Ausdruck wird durch einen Punkt . symbolisiert.
Beispiel: Das awk-Skript
$1~/M.m/
würde unter anderem für folgende Zeichenketten passen,
Mime aMime bMummu ccccMxm ddMMMM2mmm
Anker
BearbeitenIn obigen Beispielen durfte ein bestimmtes Suchmuster irgendwo in einem Feld oder Datensatz vorkommen, damit eine Aktion gestartet wurde. Wir können das Vorkommen eines Suchmusters aber auch auf den Anfang oder das Ende eines Feldes oder Datensatzes beschränken. Dazu dienen die Zeichen ^ (Anfang) und $ (Ende).
Beispiel: Alle Datensätze, die mit Mi beginnen sollen ausgegeben werden.
awk-Skript:
/^Mi/
Beispiel: Alle Datensätze, deren erstes Feld mit z endet, sollen ausgegeben werden.
awk-Skript:
$1~/z$/
Beispiel: Der reguläre Ausdruck ^..$ deckt alle Strings ab, die genau 2 Zeichen lang sind.
Zeichenklassen
BearbeitenSollen nur bestimmte Zeichen an einer Stelle zugelassen werden, dann sind Zeichenklassen von großem Nutzen. Eine Zeichenklasse wird durch eckige Klammern [] gekennzeichnet.
Beispiel: Wir wollen alle Datensätze ausgeben in denen Mim, mim, Mam, mam, Mum oder mum vorkommen.
awk-Skript:
/[Mm][aiu]m/
Beispiel: Es sollen alle Datensätze ausgegeben werden, die mit Buchstaben zwischen A und F (groß- oder kleingeschrieben) beginnen.
awk-Skript:
/^[A-Fa-f]/
Beispiel: Es sollen alle Datensätze ausgegeben werden, die nicht mit Buchstaben zwischen A und F (groß- oder kleingeschrieben) beginnen.
awk-Skript:
/^[^A-Fa-f]/
gawk kennt auch Gruppen spezieller Zeichenklassen, zum Beispiel
Zeichenklasse | |
---|---|
[:alnum:] | alle alphanumerischen Zeichen |
[:alpha:] | alle Zeichen des Alphabets |
[:blank:] | Leerzeichen und Tabulator |
[:cntrl:] | alle Steuerzeichen |
[:digit:] | Ziffern [0-9] |
[:lower:] | alle kleingeschriebenen Zeichen des Alphabets |
[:upper:] | alle großgeschriebenen Zeichen des Alphabets |
[:xdigit:] | Hexadezimalziffern [0-9a-f] |
Beispiel: Das awk-Skript
/^[[:alpha:]]/
listet alle mit einem Alphabetzeichen beginnenden Datensätze.
Äquivalenzklassen
BearbeitenBeispiel:
/[[=a=]]/
matcht neben a auch ä, à, â, ...
Alternativen
BearbeitenBeispiel: Mit der Bedingung
/imi|usi/
würden bei der personendatenbank.txt sowohl der Mimi- als auch der Susi-Datensatz gelistet.
Gruppierung
BearbeitenMehrere Zeichen in einem regulären Ausdruck können durch Klammerung () gruppiert werden.
Wiederholungen
BearbeitenSoll (un)abhängig von der Anzahl eines bestimmten Zeichens oder einer Zeichengruppe die Aktion ausgeführt werden, so können Quantoren hilfreich sein.
Quantor | Bedeutung | Beispiel | "matcht" |
---|---|---|---|
* | beliebig oft | (xa)* | "", xa, xaxa, xaxaxa, ... |
+ | beliebig oft, aber mindestens einmal | (xa)+ | xa, xaxa, xaxaxa, ... |
? | null- oder einmal | (xa)? | "", xa |
{n} | genau n-mal | (xa){2} | xaxa |
{n,} | mindestens n-mal | (xa){2,} | xaxa, xaxaxa, ... |
{,n} | höchstens n-mal | (xa){,2} | "", xa, xaxa |
{n,m} | n- bis m-mal | (xa){2,3} | xaxa, xaxaxa |
Escape-Sequenzen
BearbeitenWie sucht man in einem Text nach dem Vorkommen eines Punktes? Ein regulärer Ausdruck in der Form
/./
ist nicht zielführend, da der Punkt . bei regulären Ausdrücken ein beliebiges Zeichen charakterisiert.
Deshalb besteht die Möglichkeit, die Sonderbedeutung eines Zeichens temporär auszuschalten (zu quoten). Zu diesem Zweck stellt man dem Sonderzeichen einen Backslash \ voran.
Beispiel:
/\./
Auch Steuerzeichen oder Formatangaben werden mit einem Backslash \ eingeleitet.
Diesen Vorgang bezeichnet man generell in allen Programmiersprachen als 'escapen'.
Beispiele:
Steuerzeichen | Bedeutung |
---|---|
\a | BEL, Piepston |
\t | HT, horizontalerTabulator |
\n | LF, neue Zeile |
\r | CR, carriage return |
\nnn | eine Zahl nnn im OCT-Format |
\xhh | eine Zahl hh im HEX-Format |
Reguläre Ausdrücke sind nicht auf Bedingungen beschränkt, auch innerhalb von Aktionen ist dieses Konzept einsetzbar.
Beispiel: Das awk-Skript
{if ($1~/M.m/) print $0}
entspricht
$1~/M.m/