Ein Leitfaden für fortgeschrittene awk-Skripterstellung

In diesem Artikel werden die Möglichkeiten von awk erkundet, die einfacher zu nutzen sind, wenn Sie wissen, wie Sie Ihren Befehl in ein ausführbares Skript strukturieren.

Logische Operatoren und Konditionale

Sie können die logischen Operatoren und (geschrieben &&) und oder (geschrieben ||) verwenden, um Ihren Konditionalen Spezifität zu verleihen.

Um zum Beispiel nur Datensätze mit der Zeichenfolge „lila“ in der zweiten Spalte und einem Wert kleiner als fünf in der dritten Spalte auszuwählen und zu drucken:

$2 == "purple" && $3 < 5 {print $1}

Wenn ein Datensatz „lila“ in Spalte zwei hat, aber einen Wert größer oder gleich 5 in Spalte drei, dann wird er nicht ausgewählt. Ähnlich verhält es sich, wenn ein Datensatz die Anforderung von Spalte drei erfüllt, aber „lila“ in Spalte zwei fehlt, wird er ebenfalls nicht ausgewählt.

Angenommen, Sie möchten jeden Datensatz in Ihrer Datei auswählen, bei dem der Betrag größer oder gleich 8 ist, und einen passenden Datensatz mit zwei Sternchen (**) ausgeben. Sie möchten auch jeden Datensatz mit einem Wert zwischen fünf (einschließlich) und acht mit nur einem Sternchen (*) markieren. Es gibt einige Möglichkeiten, dies zu tun, und eine Möglichkeit ist, den nächsten Befehl zu verwenden, um awk anzuweisen, dass es nach einer Aktion mit dem Scannen aufhören und mit dem nächsten Datensatz fortfahren soll.

Hier ist ein Beispiel:

NR == 1 {
print $0;
next;
}
$3 >= 8 {
printf "%s\t%s\n", $0, "**";
next;
}
$3 >= 5 {
printf "%s\t%s\n", $0, "*";
next;
}
$3 < 5 {
print $0;
}

BEGIN-Befehl

Mit dem BEGIN-Befehl können Sie Variablen drucken und setzen, bevor awk mit dem Scannen einer Textdatei beginnt. So können Sie zum Beispiel die Trennzeichen für Ein- und Ausgabefelder innerhalb Ihres awk-Skripts setzen, indem Sie sie in einer BEGIN-Anweisung definieren. Dieses Beispiel passt das einfache Skript aus dem vorigen Artikel für eine Datei mit Feldern an, die durch Kommas statt durch Leerzeichen getrennt sind:

END-Befehl

Der END-Befehl ermöglicht es Ihnen, wie BEGIN, Aktionen in awk auszuführen, nachdem es die Textdatei, die Sie gerade verarbeiten, durchsucht hat. Wenn Sie die kumulierten Ergebnisse eines Wertes in allen Datensätzen ausgeben wollen, können Sie das erst tun, nachdem alle Datensätze gescannt und verarbeitet wurden.

Die Befehle BEGIN und END laufen jeweils nur einmal. Alle Regeln dazwischen werden für jeden Datensatz null oder mehr Mal ausgeführt. Mit anderen Worten, der größte Teil Ihres awk-Skripts ist eine Schleife, die bei jeder neuen Zeile der zu verarbeitenden Textdatei ausgeführt wird, mit Ausnahme der BEGIN- und END-Regeln, die vor und nach der Schleife ausgeführt werden.

Hier ist ein Beispiel, das ohne den END-Befehl nicht möglich wäre. Dieses Skript akzeptiert Werte aus der Ausgabe des Unix-Befehls df und erhöht zwei benutzerdefinierte Variablen (used und available) mit jedem neuen Datensatz.

$1 != "tempfs" {
used += $3;
available += $4;
}
END {
printf "%d GiB used\n%d GiB available\n", used/2^20, available/2^20;
}

Speichern Sie das Skript als total.awk und probieren Sie es aus:

df -l | awk -f total.awk

Die Variablen used und available verhalten sich wie Variablen in vielen anderen Programmiersprachen. Sie legen sie beliebig und ohne Deklaration ihres Typs an und fügen ihnen nach Belieben Werte hinzu. Am Ende der Schleife addiert das Skript die Datensätze in den jeweiligen Spalten zusammen und gibt die Summen aus.

Mathe

Wie Sie wahrscheinlich an den ganzen logischen Operatoren und beiläufigen Berechnungen bisher erkennen können, beherrscht awk Mathematik ganz natürlich. Das macht es wohl zu einem sehr nützlichen Taschenrechner für Ihr Terminal. Anstatt sich die eher ungewöhnliche Syntax von bc zu merken, können Sie einfach awk zusammen mit seiner speziellen BEGIN-Funktion verwenden, um das Erfordernis eines Datei-Arguments zu vermeiden:

$ awk 'BEGIN { print 2*21 }'
42
$ awk 'BEGIN {print 8*log(4) }'
11.0904

Zugegeben, das ist immer noch eine Menge Tipparbeit für einfache (und nicht so einfache) Mathematik, aber es würde nicht viel Mühe machen, ein Frontend zu schreiben, was eine Übung für Sie ist, die Sie erkunden können.

Dieser Artikel ist eine Adaption einer Episode von Hacker Public Radio, einem Community-Technologie-Podcast.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.