Awk: Weiterführende Themen
Debugging
BearbeitenMit dgawk gibt es für AWK ein mächtigen Debugger. Weitergehende Informationen sind in der gawk-Doku zu finden. In den meisten Linux-Distributionen ist dgawk nicht in den Repositories enthalten. Deshalb muss man ggf. das Paket selber neu bauen.
Profiling
Bearbeitenpgawk ist eine spezielle Variante von gawk extra für Profilingzwecke.
Beispiel: Gegeben sei die Eingabedatei prof.txt mit dem Inhalt
1 Freddy 2 Maxi 3 Mimi 4 Zenzi 5 Susi 6 Franzi 7 Resi 8 Hilda
awk-Skript:
#!/usr/bin/pgawk -f BEGIN {print "ANFANG"} $2~/^[A-M]/ {print $1 ": " $2} END {print "ENDE"}
Inhalt der Profilingdatei awkprof.out:
# gawk-Profil, erzeugt Wed Nov 16 10:12:41 2005 # BEGIN block(s) BEGIN { 1 print "ANFANG" } # Rule(s) 8 $2 ~ /^[A-M]/ { # 5 5 print (($1 ": ") $2) } # END block(s) END { 1 print "ENDE" }
Beschreibung von awkprof.out: Die awkprof.out-Datei enthält den von uns erstellten awk-Code, ergänzt um Kommentare und Zahlen. Die Zahlen vor den Bedingungen und Aktionen zeigen die Häufigkeit des Aufrufes der entsprechenden Anweisungen. Die BEGIN- und END-Aktion wurden logischerweise nur 1x aufgerufen, die Suchbedingung 8x und die dazugehörige Aktion bzw. print-Anweisung 5x.
Funktionsbibliotheken
BearbeitenWenn ein Skript zu umfangreich und unübersichtlich wird oder einzelne Funktionen zwecks Wiederverwendung an zentraler Stelle gesammelt werden sollen, so können einzelne Funktionen in sogenannte Funktionsbibliotheken ausgelagert werden. Eine solche Funktionsbibliothek ist nichts anderes als ein normales awk-Skript.
Beispiel:
funktionsbibliothek.awk:
function schreibe(a,b) { print a ": " b }
skript.awk:
#!/usr/bin/awk -f BEGIN {print "ANFANG"} $2~/^[A-M]/ {schreibe($1, $2)} END {print "ENDE"}
Aufruf:
awk -f funktionsbibliothek.awk -f skript.awk eingabedatei.txt
Siehe auch die Möglichkeit mit igawk in Abschnitt Objektorientierte Programmierung.
gawk im Netzwerk
Bearbeiten(ab gawk-Release 3.1)
Bidirektionale Pipeline
BearbeitenMit dem |&-Operator kann eine bidirektionale Pipeline eingerichtet werden.
Bsp:
print var |& kommando
Netzwerkadressierung
BearbeitenDie Netzwerkadressierung erfolgt über einen Dateinamen in der Form
/inet/protocol/localport/hostname/remoteport
mit
- protocol: tcp, udp oder raw
- localport: Port auf dem lokalen Host (siehe auch /etc/services)
- hostname: symbolischer Name oder IP-Nummer des entfernten Hosts
- remoteport: Port auf dem entfernten Host (siehe auch /etc/services)
Beispiel: Lokalen FTP-Server abfragen
Bearbeiten#!/usr/bin/awk -f BEGIN { inetService = "/inet/tcp/0/localhost/ftp" # Variable für Netzwerkadressierung setzen inetService |& getline # bidirektionale Pipeline etablieren print $0 # Meldung ausgeben close(inetService) # Pipeline komplett schliessen }
Ausgabe (natürlich nur wenn ein FTP-Server auf der lokalen Machine eingerichtet ist):
220 meinrechner.local FTP server (Version 6.5/OpenBSD, linux port 0.3.3) ready
Beispiel: Einlesen einer Webseite (HTTP)
Bearbeiten#!/usr/bin/awk -f BEGIN { RS = ORS = "\r\n" inetService = "/inet/tcp/0/www.yahoo.de/80" # Variable für Netzwerkadressierung setzen print "GET / HTTP/1.0\r\n" |& inetService # bidirektionale Pipeline etablieren # (zwei \r\n nötig) while ((inetService |& getline) > 0) # Lies in $0 ein, solange nicht EOF oder Error print $0 # Gib $0 aus close(inetService) # bidiektionale Pipeline komplett schließen }
Ausgabe:
The document has moved <A HREF="http://de.yahoo.com/">here</A>.<P>