So verwenden Sie BEGIN und END effektiv in Awk
In Teil 8 dieser Awk-Serie haben wir einige leistungsstarke awk-Befehlsfunktionen vorgestellt, d. h. Variablen, numerische Ausdrücke und Zuweisungsoperatoren.
In diesem Abschnitt werden wir zusätzliche Awk-Funktionen behandeln, insbesondere spezielle Muster: BEGIN und END. Diese speziellen Funktionen werden nützlich sein, wenn wir unsere Erkundung komplexer Awk-Operationen erweitern.
Um zu beginnen, lassen Sie uns unsere Gedanken zurück zur Einführung der Awk-Serie treiben, erinnern Sie sich, als wir diese Serie begannen, wies ich darauf hin, dass die allgemeine Syntax zum Ausführen eines Awk-Befehls lautet:
awk 'script' filenames
In dieser Syntax wird das Awk-Skript wie folgt formatiert:
/pattern/ { actions }
Wenn Sie das Muster im Skript betrachten, handelt es sich normalerweise um einen regulären Ausdruck, zusätzlich können Sie sich Muster auch als spezielle Muster BEGIN und END vorstellen.
Daher können wir auch einen Awk-Befehl in der folgenden Form schreiben:
awk '
BEGIN { actions }
/pattern/ { actions }
/pattern/ { actions }
...
END { actions }
' filenames
Für den Fall, dass Sie die speziellen Muster BEGIN und END in einem Awk-Skript verwenden, bedeutet jedes von ihnen Folgendes:
- BEGIN-Muster: bedeutet, dass Awk die in
BEGINangegebene(n) Aktion(en) einmal ausführt, bevor Eingabezeilen gelesen werden. - END-Muster: bedeutet, dass Awk die in
ENDangegebene(n) Aktion(en) ausführt, bevor es beendet wird.
Der Ausführungsablauf für ein Awk-Befehlsskript mit diesen Mustern sieht wie folgt aus:
- Wenn das
BEGIN-Musterin einem Skript verwendet wird, werden alle Aktionen fürBEGINeinmal ausgeführt, bevor eine Eingabezeile gelesen wird. - Dann wird eine Eingabezeile gelesen und in die verschiedenen Felder geparst.
- Als nächstes wird jedes der angegebenen nicht-speziellen Muster mit der Eingabezeile für eine Übereinstimmung verglichen, und wenn eine Übereinstimmung gefunden wird, werden die Aktion(en) für dieses Muster ausgeführt. Diese Phase wird für alle von Ihnen angegebenen Muster wiederholt.
- Als nächstes werden die Phasen 2 und 3 für alle Eingangsleitungen wiederholt.
- Wenn alle Eingabezeilen gelesen und verarbeitet wurden, falls Sie das
END-Musterangeben, werden die Aktion(en) ausgeführt.
Sie sollten sich diese Ausführungsreihenfolge immer merken, wenn Sie mit speziellen Mustern arbeiten, um die besten Ergebnisse in einem Awk-Vorgang zu erzielen.
Um alles zu verstehen, veranschaulichen wir dies anhand des Beispiels aus Teil 8 über die Liste der Domains im Besitz von Tecmint, wie sie in einer Datei mit dem Namen domains.txt gespeichert sind.
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
In diesem Beispiel möchten wir zählen, wie oft die Domäne linux-console.net in der Datei domains.txt aufgeführt ist. Also haben wir ein kleines Shell-Skript namens 'script.sh' geschrieben, das uns dabei hilft, die Idee von Variablen, numerischen Ausdrücken und Zuweisungsoperatoren zu verwenden, die den folgenden Inhalt haben:
#!/bin/bash
for file in $@; do
if [ -f $file ]; then
echo "File is: $file"
awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file
else
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
exit 0
Lassen Sie uns nun die beiden speziellen Muster BEGIN und END im Awk-Befehl im obigen Skript wie folgt verwenden:
awk '
BEGIN { print "The number of times linux-console.net appears in the file is:" ; }
/^linux-console.net/ { counter+=1 ; }
END { printf "%s\n", counter ; }
' $file
Nachdem Sie die Änderungen am Awk-Befehl vorgenommen haben, sieht das vollständige Shell-Skript nun wie folgt aus:
#!/bin/bash
for file in $@; do
if [ -f $file ]; then
echo "File is: $file"
awk '
BEGIN { print "The number of times linux-console.net appears in the file is:" ; }
/^linux-console.net/ { counter+=1 ; }
END { printf "%s\n", counter ; }
' $file
else
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
exit 0
Wenn Sie dieses Skript ausführen, wird zuerst der Speicherort der Datei angezeigt und dann der Befehl Awk ausgeführt. Das BEGIN-Muster druckt die Nachricht, bevor Eingabezeilen verarbeitet werden. Das Muster /^linux-console.net/ zählt die Vorkommen von linux-console.net, und das END-Muster gibt die Gesamtanzahl aus.
Dann wird unser Muster /^linux-console.net/ mit jeder Eingabezeile verglichen und die Aktion { counter+=1 ; } wird für jede Eingabezeile ausgeführt, die zählt, wie oft linux-console.net in der Datei erscheint.
Schließlich gibt das END-Muster die Gesamtzahl aus, mit der die Domäne linux-console.net in der Datei angezeigt wird.
./script.sh domains.txt
Schlussfolgerung
Abschließend haben wir weitere Awk-Funktionen vorgestellt, die sich mit den Konzepten spezieller Muster befasst haben: BEGIN und END.
Wie ich bereits erwähnt habe, werden uns diese Awk-Funktionen dabei helfen, komplexere Textfilteroperationen zu erstellen, es gibt mehr unter Awk-Funktionen zu behandeln, und in Teil 10 werden wir uns der Idee der in Awk integrierten Variablen nähern, also bleiben Sie in Verbindung.
Für diejenigen, die eine umfassende Ressource suchen, haben wir alle Artikel der Awk-Serie in einem Buch zusammengestellt, das 13 Kapitel umfasst und sich über 41 Seiten erstreckt und sowohl die grundlegende als auch die fortgeschrittene Verwendung von Awk mit praktischen Beispielen abdeckt.
| Produktname | Preis | Kaufen |
|---|---|---|
| E-Book: Einführung in den AWK-Leitfaden für Anfänger | 8,99 $ | [Jetzt kaufen] |


