Awk: Weiterführende Themen

Aus Wikibooks

Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu Grundlagen | One wikibook.svg Hoch zu Gesamtinhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Anwendungsbeispiele


Inhaltsverzeichnis

[Bearbeiten] Profiling

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.

[Bearbeiten] Funktionsbibliotheken

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

[Bearbeiten] gawk im Netzwerk

(ab gawk-Release 3.1)

[Bearbeiten] Bidirektionale Pipeline

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

Bsp:

print var |& kommando

[Bearbeiten] Netzwerkadressierung

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)

[Bearbeiten] Beispiel: Lokalen FTP-Server abfragen

#!/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

[Bearbeiten] Beispiel: Einlesen einer Webseite (HTTP)

#!/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>


Wikibooks buchseite.svg Zurück zu Grundlagen | One wikibook.svg Hoch zu Gesamtinhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Anwendungsbeispiele
Persönliche Werkzeuge