Gawk/Operatoren
Awk kennt nahezu das komplette Repertoire an Operatoren, die die Programmiersprachen zur Manipulation von Ausdrücken zur Verfügung stellen.
Arithmetische Operatoren
+ | Addition |
- | Subtraktion |
* | Multiplikation |
/ | Division |
% | Modulo |
^ | Potenzieren (Posix) |
** | Potenzieren (gawk u.a.) |
- Da letzterer Potenzoperator (**) nicht im POSIX-Standard enthalten ist, muss eine konkrete Awk-Implementierung diesen nicht zwangläufig verstehen.
- Verwenden Sie daher stets »^«, um Ihre Awk-Skripte portabel zu halten.
Im Falle der Division sollten Sie prüfen, dass der Divisor nicht 0 wird, da Awk sonst mit einem Ausnahmefehler das Programm abbricht:
$ awk 'BEGIN { x=5; y; print x/y; }' awk: Kommandozeile:1: Fatal: Division durch Null wurde versucht
Für arithmetische Operationen gelten die üblichen Vorrangregeln.
$ awk 'BEGIN { print 5*4+20, 5*(4+20); }' 40 120
Zuweisungsoperatoren
- Das Gleichheitszeichen zur Zuweisung eines Wertes an eine Variable sollte hinreichend bekannt sein; dem C erfahrenen Programmierer sollten auch die folgenden Operatoren vertraut erscheinen:
Operator | Kurzschreibweise für |
x++ bzw. ++x | x = x + 1 |
x-- bzw. --x | x = x - 1 |
X += y | x = x + y |
X -=y | x = x – y |
X *= y | x = x * x |
X /= y | x = x / y |
X %= y | x = x % y |
X ^= y | x = x ^ y |
X **= y | x = x ** y |
- Mit Ausnahme von Inkrement- und Dekrement-Operatoren bleibt es Ihnen überlassen, ob Sie die Kurzform der ausführlichen Schreibweise vorziehen.
- Für Inkrement bzw.
- Dekrement entsprechen genau genommen nur ++x und --x (Prefix-Operatoren) der Semantik der langen Darstellung, denn nur hier werden die Zuweisungen zuerst ausgeführt und erst anschließend der Wert von x evaluiert.
- Als Postfix-Operatoren (x++, x--) verwendet, geht der alte Wert der Variable x in einem Ausdruck ein und erst nach Auswertung erfolgt die Zuweisung des neuen Wertes an x.
- Beispiele
$ awk 'BEGIN { x=5; print x = x + 1, x; }' 6 6 $ awk 'BEGIN { x=5; print x++, x; }' 5 6 $ awk 'BEGIN { x=5; print ++x, x; }' 6 6
Das folgende Beispiel demonstriert, dass tatsächlich in scheinbar gleichwertigen Ausdrücken abweichende Resultate erzielt werden:
$ awk 'BEGIN { while ( ++x < 5 ) print x }' 1 2 3 4
$ awk 'BEGIN { while ( x++ < 5 ) print x }' 1 2 3 4 5
Das nächste Beispiel zählt die Dateien im aktuellen Verzeichnis und berechnet ihren Speicherbedarf:
$ ls -l | awk '{ ++files; sum+=$5 } END { print sum, "Bytes in", files, "Dateien"; }'
Vergleichsoperatoren
< | Kleiner als |
> | Größer als |
<= | Kleiner als oder gleich |
>= | Größer als oder gleich |
= | Gleich |
!= | Ungleich |
~ | Übereinstimmung |
!~ | Keine Übereinstimmung |
- Der Zweck der ersten 6 Operatoren sollte leicht erkenntlich sein.
- Beachten Sie, dass der Test auf Gleichheit »=« anstatt »=« verwendet.
- Eine Verwechslung wäre kein Syntaxfehler (und ist daher als Fehler schwer zu erkennen), führt aber zu abweichenden Ergebnissen!
- Bei den Operatoren ~ und !~ dürfen als rechtsseitige Operanden auch reguläre Ausdrücke stehen, während bei allen anderen Operatoren einzig Variablen und Konstanten zulässig sind.
Beispiel
Finde alle Benutzer, deren Heimatverzeichnis unter /home liegt:
$ awk '$6 ~ /^\/home.*/ { print $1; }' /etc/passwd user tux
Logische Operatoren
&& | Logisches UND | |
Logisches ODER | ||
! | Negation |
- Logische oder boolesche Operatoren dienen maßgeblich zur Verknüpfung mehrerer Vergleichsoperatoren oder mehrerer regulärer Ausdrücke.
Das Beispiel listet alle Dateien des aktuellen Verzeichnisses auf, die zwischen 4097 und 8192 Bytes groß sind:
$ ls -l /etc/ | awk '$5 >= 4097 && $5 <= 8192 {print $NF; }' bogofilter.cf csh.cshrc csh.login dhcpd.conf enscript.cfg freshclam.conf my.cnf ...
Ein weiteres Beispiel veranschaulicht die Verwendung der Negation, indem im aktuellen Verzeichnis alle Dateien gesucht werden, die nicht dem aktuell angemeldeten Benutzer gehören:
$ ls -l | awk 'FNR > 1 && !($3 = ENVIRON["USER"]) {print $NF; }'
- Der Vergleich ist auch mit »!=« möglich.
Priorität der Auswertung
- Verknüpfen Sie mehrere Ausdrücke per logischer Operatoren, so kann die Priorität der Auswertung eine Rolle spielen:* Eine Negation wird vor dem logischen UND und dieses vor dem logischen ODER betrachtet.
- Nutzen Sie die Klammerung, um ggf. eine andere Bearbeitungsreihenfolge zu erzwingen.