gawk/Operatoren

Aus Foxwiki


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.