Awk: Weiterführende Themen


Debugging

Bearbeiten

Mit 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

Bearbeiten

pgawk 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

Bearbeiten

Wenn 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

Bearbeiten

Mit dem |&-Operator kann eine bidirektionale Pipeline eingerichtet werden.

Bsp:

print var |& kommando

Netzwerkadressierung

Bearbeiten

Die 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>