8.10 awk-Funktionen
awk bietet verschiedene Built-Funktionen an und erlaubt es dem Anwender eigene Funktionen zu definieren.8.10.1 awk Stringfunktionen
In der nachfolgenden Beschreibung steht :
r für regular expression als String oder /r/
s und t sind String-Ausdrücke
n und p sind Integer
a ist ein array
Funktion Beschreibung gsub(r,s, [t]) ersetzt global alle gefundenen r (regular expression) durch s (String) im Satz $0 oder in der angegebenen t (Textvariablen) geb="29.01.44" gsub(/[0-9]+/, "(&) ", geb) --> "(29).(01).(44)" index(s,t) liefert die Position vom ersten t im String s. Wenn t nicht in s enthalten ist, wird 0 zurückgegeben index("Reportgenerator","or") -> 4 length(s) liefert die Länge von String s zurück x = length("Reportgenerator") -> 15 print length($0) match(s,r) liefert die Position von t im String s. Wenn t nicht in s enthalten ist, wird 0 zurückgegeben. Im Unterschied zu index() wir als Suchmuster ein regular expression akzeptiert. Zusätzlich werden die Systemvariablen RSTART (Anfangsposition des gefundenen Strings) und RLENGTH (Länge des gefundenen Musters) gesetzt. Wurde r nicht gefunden ist RSTART=0 und RLENGTH=1. { if (match($0, /a.?i/)) print RSTART, RLENGTH, $0 } split(s,a,[r}) splittet s in Einzelfelder. Zur Feldtrennung wird die Variable FS b.z.w. r herangezogen. split($0,zeile,/[0-9]:/) sprintf(s,fmt[,expr-list]) formatiert die expr-list gemäß der Formatspezifikationen im fmt String und legt das Ergebnis im String s ab statt es wie printf auf stdout auszugeben. sub(r,s, [t]) ersetzt nur den ersten gefundenen r (regular expression) durch s (String) im Satz $0 oder in der angegebenen- t (Textvariablen) substr(s,p,[n]) substr extrahiert aus dem String s ab der Position p n Zeichen oder den Rest des Strings. substr("extrahieren",6,4) --> hier substr("extrahieren",1,5) --> extra toupper(s) liefert den angegebenen String als Großbuchstaben zurück. tolower(s) liefert den angegebenen String als Kleinbuchstaben zurück.
8.10.2 awk Mathematische Funktionen
Funktion Rückgabewert atan2(y,x) Arcus Tangens von y /x im Bereich -p bis p cos(x) Cosinus von x. x muß asl Bogenmaß übergeben werden exp(x) Exponentialfunktion von x int(x) Ganzzahligen Teil, abgeschnitten in Richtung Null log(x) Natürlicher Logarithmus von x rand() Zufallszahl im Bereich 0 bis 1 sin(x) Sinus von x. x muß als Bogenmaß übergeben werden sqrt(x) Quadratwurzel von x srand(x) x ist ein neuer Startwert für die Funktion rand()
8.10.3 Time Functions
Da mit dem awk häufig Log-Dateien ausgewertet werden die Zeitangaben (timestamps) enthalten,
bietet der awk zwei Zeitfunktionen an. systime() liefert die Zeit in Sekunden seit dem UNIX-Zero-Date Midnight UTC, 1.1.1970 (UTC Universal Time Coordinate) strftime(format,timestamp) formatiert eine Zeitmarke die als timestamp vorliegt mit Hilfe eines Formatstrings und liefert einen String zurück. Im Formatstring können alle Spezifikationen verwendet werden, die auch in date benutzt werden können. print strftime(" Datum : %d.%m.%y Zeit : %H:%M", systime())
8.10.4 awk Eigene Funktionen
Funktionen sind eine Erweiterung des nawk. Sie werden im Actionteil eines awk-Script aufgerufen. Es können Parameter an die Funktion übergeben werden. Syntax function f_name(p1,p2) # p1 und p2 sind Parameter { printf " %7.2f \n", p1 * p2 } f_name(4, 6.5) # Aufruf der Funktion mit Argumentenliste Die Syntax für lokale Variablen ist sehr ungeschickt gewählt worden. Sie werden definiert, indem sie in der Parameterliste nach einigen Blanks angeführt werden. function f_name(p1,p2, v1,v1) # v1 und v2 sind lokale Variablen
8.10.5 Function ansprechen
Eine Funktion wird durch Namensnennung angesprochen. Die öffnende Klammer muß unmittelbar hinter dem Funktionsnamen folgen (kein Blank dazwischen erlaubt). f_name(74,57) spricht die Funktion an und übergibt 2 Parameter. Eine Funktion kann andere Funktionen aufrufen. Der Aufruf darf auch rekursiv erfolgen.
8.10.6 system-Function
Mit Hilfe der system-Funktion kann aus dem awk eine beliebige UNIX-Anweisung ausgeführt werden. awk ' $1 == "#include" { gsub(/<>"/ , "" , $2) ; system ("cat " $2) } ' progr.c