Awk: Grundlagen: Bedingungen
Mittels Bedingung(en) kann eine Filterung der zu bearbeitenden Datensätze erfolgen.
Vergleichsoperatoren
[Bearbeiten]Eine Bedingung ergibt sich oftmals aufgrund eines Vergleiches zweier Elemente. Die Aktion wird dann ausgeführt, wenn das Ergebnis des Vergleiches ein logisches TRUE ergibt.
Beispiel: Die Eingabedatei test2.txt habe folgenden Inhalt:
1 5 5 6 8 2 7 7 8 1
Alle Datensätze, in denen das erste Feld einen größeren Wert als das zweite Feld hat, sollen auf der Standardausgabe ausgegeben werden.
Das awk-Skript test.awk lautet also:
$1>$2 {print $0}
Mit folgendem awk-Kommando wird die Eingabedatei in gewünschter Weise ausgewertet
awk -f test.awk test2.txt
Ergebnis:
8 2 8 1
Mögliche Vergleichsoperatoren für awk-Bedingungen sind:
Operator | Beschreibung |
---|---|
== | ist gleich |
< | kleiner als |
> | größer als |
<= | kleiner gleich |
>= | größer gleich |
!= | ungleich |
~ | enthält (relevant für reguläre Ausdrücke) |
!~ | enthält nicht (relevant für reguläre Ausdrücke) |
Verknüpfungen
[Bearbeiten]Teilbedingungen können auch zu einer Gesamtbedingung verknüpft werden. Zu diesem Zwecks gibt es die Operatoren && (logisches UND), || (logisches ODER) und ! (logische Negation).
Beispiel:
Eingabedatei test2.txt:
1 5 5 6 8 2 7 7 8 1
Alle Datensätze, in denen das erste Feld einen größeren Wert als das zweite besitzt UND das zweite Feld eine 1 darstellt, sollen auf der Standardausgabe ausgegeben werden.
awk-Skript test3.awk:
$1>$2 && $2==1 {print $0}
awk-Kommando:
awk -f test3.awk test2.txt
Ergebnis:
8 1
Wenn nur eine Bedingung und keine Aktion angegeben wird, dann werden alle Zeilen ausgegeben, die der Bedingung entsprechen. Das Skript test3.awk aus dem letzten Kapitel würde also dasselbe Ergebnis liefern, wenn '{print $0}' weggelassen wird.
awk-Skript test3b.awk:
$1>$2 && $2==1
Leere Bedingung
[Bearbeiten]Wird keine Bedingung angegeben, so wird die entsprechende Aktion für alle Zeilen der Eingabe bzw. der Eingabedatei(en) durchgeführt.
Beispiel:
awk-Skript test3a.awk zur Bearbeitung der Datei test2.txt aus dem letzten Kapitel:
{print $1}
awk-Kommando:
awk -f test3a.awk test2.txt
Ergebnis:
1 5 8 7 8
BEGIN und END
[Bearbeiten]awk kennt die Bedingungen BEGIN und END. Eine mit der BEGIN-Bedingung verknüpfte Aktion wird vor dem Lesen des ersten Datensatzes ausgeführt. Eine mit einer END-Bedingung verknüpfte Aktion wird nach dem Lesen des letzten Datensatzes abgearbeitet.
Beispiel: Ein Dateilisting soll in eine Ausgabedatei geschrieben werden. In der Ausgabedatei sollen an erster Stelle Firma und Abteilung aufgelistet werden und ganz zum Schluss der Vermerk --- ENDE --- .
awk-Skript test.awk:
BEGIN {print "Firma: XYZ" print "Abteilung: X123"} END {print "---ENDE---"} {print $0}
awk-Kommando:
ls | awk -f test.awk > ausgabe.txt
Der Inhalt der Ausgabedatei ausgabe.txt könnte beispielsweise so aussehen:
Firma: XYZ Abteilung: X123 bin doc include lib tmp X11 ---ENDE---
Suchmuster / Regulärer Ausdruck
[Bearbeiten]Soll nach dem Vorkommen bestimmter Textmuster gefiltert werden, so helfen uns die bisherigen Methoden nicht weiter. Dann ist der Einsatz von Suchmustern in Form regulärer Ausdrücke ein probates Mittel zur Problemlösung. Suchmuster sind in Schrägstriche einzukapseln /regexp/.
Beispiel: Eine Personendatenbank soll gefiltert werden. Alle Personen, deren Vorname mit M beginnt sollen ausgegeben werden.
Die Eingabedatei personendatenbank.txt sieht folgendermaßen aus:
Mimi P 13.08.2005 Susi T 23.09.1999 Fritz X 03.03.2001 Max P 17.11.1985
awk-Skript:
$1~/^M/ {print $0}
Ausgabe:
Mimi P 13.08.2005 Max P 17.11.1985
Bereiche
[Bearbeiten]Soll eine Aktion nur innerhalb eines bestimmten Bereichs der Eingabe(datei[en]) ausgeführt werden, so kann die daraus resultierende Gesamtbedingung folgendermaßen angegeben werden
Bedingung1, Bedingung2 {Aktion}
Die Aktion wird dann ab dem Zutreffen der Bedingung1 bis zum Zutreffen der Bedingung 2 (inklusive) ausgeführt. Als Vergleichsoperatoren in den Bedingungen eignen sich dabei nur == und ~.