Awk: Anwendungsbeispiele
Beispiel 1
BearbeitenLogdateien sollen ausgewertet werden. Nachfolgend ein Auszug aus einer solchen Logdatei
11 November 2005 [MESSAGE] Hallo dies ist eine Message [/MESSAGE] 11 November 2005 Irgendwas 1 11 November 2005 Irgendwas 2 12 November 2005 [MESSAGE] Warnung! Defekt 1 droht [/MESSAGE] 12 November 2005 [MESSAGE] ALARM! Defekt 1 aufgetreten [/MESSAGE] 13 November 2005 Irgendwas 3 14 November 2005 [MESSAGE] Hallo [/MESSAGE] 15 November 2005 Irgendwas 4 15 November 2005 Irgendwas 5 16 November 2005 [MESSAGE] Warnung! Streik [/MESSAGE]
Aus diesen Logdateien werden die Meldungen zwischen [MESSAGE] und [/MESSAGE] in eine HTML-Datei ausgegeben. Das sieht im Konqueror folgendermaßen aus:
awk-Skript:
#!/usr/bin/awk -f BEGIN { flag=0 # HTML-Header print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">" print "<html>" print "<head>" print "</head>" print "<body>" print "<h2>Auswertung von " ARGV[1] "</h2>" } END { # HTML-ENDE print "</body>" print "</html>" } $4=="[MESSAGE]" {flag=1; color="black"} $5=="Warnung!" {color="green"} $5=="ALARM!" {color="red"} { if(flag==1) { var = "<font color=\"" color "\">" $1 " " $2 " " $3 ": " for(i=5; i<NF; i++) var = var " " $i print var " </font><br />" flag=0 } }
Beispiel 2
BearbeitenDieses Beispiel wurde unverändert von en.wikibooks.org/wiki/AWK [1] übernommen.
- Lizenz: GFDL
- Autor: Andrew M. Ross (Harvey Mudd College Department of Computer Science)
- Wikibooks-Import und -Adaptierung: BenFrantzDale, Geocachernemesis
- Stand: 09:20, 4 June 2005
# This awk program collects statistics on two # "random variables" and the relationships # between them. It looks only at fields 1 and # 2 by default Define the variables F and G # on the command line to force it to look at # different fields. For example: # awk -f stat_2o1.awk F=2 G=3 stuff.dat \ # F=3 G=5 otherstuff.dat # or, from standard input: # awk -f stat_2o1.awk F=1 G=3 # It ignores blank lines, lines where either # one of the requested fields is empty, and # lines whose first field contains a number # sign. It requires only one pass through the # data. This script works with vanilla awk # under SunOS 4.1.3. BEGIN{ F=1; G=2; } length($F) > 0 && \ length($G) > 0 && \ $1 !~/^#/ { sx1+= $F; sx2 += $F*$F; sy1+= $G; sy2 += $G*$G; sxy1+= $F*$G; if( N==0 ) xmax = xmin = $F; if( xmin > $F ) xmin=$F; if( xmax < $F ) xmax=$F; if( N==0 ) ymax = ymin = $G; if( ymin > $G ) ymin=$G; if( ymax < $G ) ymax=$G; N++; } END { printf("%d # N\n" ,N ); if (N <= 1) { printf("What's the point?\n"); exit 1; } printf("%g # xmin\n",xmin); printf("%g # xmax\n",xmax); printf("%g # xmean\n",xmean=sx1/N); xSigma = sx2 - 2 * xmean * sx1+ N*xmean*xmean; printf("%g # xvar\n" ,xvar =xSigma/ N ); printf("%g # xvar unbiased\n",xvaru=xSigma/(N-1)); printf("%g # xstddev\n" ,sqrt(xvar )); printf("%g # xstddev unbiased\n",sqrt(xvaru)); printf("%g # ymin\n",ymin); printf("%g # ymax\n",ymax); printf("%g # ymean\n",ymean=sy1/N); ySigma = sy2 - 2 * ymean * sy1+ N*ymean*ymean; printf("%g # yvar\n" ,yvar =ySigma/ N ); printf("%g # yvar unbiased\n",yvaru=ySigma/(N-1)); printf("%g # ystddev\n" ,sqrt(yvar )); printf("%g # ystddev unbiased\n",sqrt(yvaru)); if ( xSigma * ySigma <= 0 ) r=0; else r=(sxy1 - xmean*sy1- ymean * sx1+ N * xmean * ymean) /sqrt(xSigma * ySigma); printf("%g # correlation coefficient\n", r); if( r > 1 || r < -1 ) printf("SERIOUS ERROR! CORRELATION COEFFICIENT"); printf(" OUTSIDE RANGE -1..1\n"); if( 1-r*r != 0 ) printf("%g # Student's T (use with N-2 degfreed)\n&", \ t=r*sqrt((N-2)/(1-r*r)) ); else printf("0 # Correlation is perfect,"); printf(" Student's T is plus infinity\n"); b = (sxy1 - ymean * sx1)/(sx2 - xmean * sx1); a = ymean - b * xmean; ss=sy2 - 2*a*sy1- 2*b*sxy1 + N*a*a + 2*a*b*sx1+ b*b*sx2 ; ss/= N-2; printf("%g # a = y-intercept\n", a); printf("%g # b = slope\n" , b); printf("%g # s^2 = unbiased estimator for sigsq\n",ss); printf("%g + %g * x # equation ready for cut-and-paste\n",a,b); ra = sqrt(ss * sx2 / (N * xSigma)); rb = sqrt(ss / ( xSigma)); printf("%g # radius of confidence interval "); printf("for a, multiply by t\n",ra); printf("%g # radius of confidence interval "); printf("for b, multiply by t\n",rb); }