AWK Reportgenerator Guide


Der Reportgenerator awk
Introawk-ProgrammEinführende BeispieleSonderzeichenFelderawk-Sprachelemente
KonstantenVariablenAusdrücke
awk-Aktionenawk-Funktionen
Numerische FunktionenFunktionen auf ZeichenkettenE/A- und generelle Funktionen
Übergabe von Shellparametern
Einfache Beispiele
Beispiele zu den Mustern
Beispiele zu den BEGIN- und END-
Mustern
Arithmetik und Variablen (Einführende Beispiele)
Arrays
Assoziative Arrays
Beispiele zu den Assoziativen Arrays
Beispiele zur Interaktion mit dem Shell-Programm
Kalender Beispiel

Der Reportgenerator awk

Intro

awk [-Fz] [parameter] [awk_program] [file . . .] 
awk [-Fz] [parameter] -f awk_script [file . . .]

awk-Programm

Die Initialisierung und der Abschluss sind optional.
BEGIN      { start_actions }   # optional
pattern1   { action1 }
pattern2   { action2 }
 . . .        . . .
END        { end_actions }     # optional

Einführende Beispiele

$ awk '/pattern/ { print }' filenames . . .
$ awk '/pattern/' filenames
$ awk '{ print }' filenames . . .

Sonderzeichen


Felder


awk-Sprachelemente

Konstanten

Variablen

Ausdrücke


awk-Aktionen

print . . . | "program args"

awk-Funktionen

Numerische Funktionen

Funktionen auf Zeichenketten

E/A- und generelle Funktionen


Übergabe von Shellparametern

$ awk 'length > maxl {print . . .}' maxl=30
$ awk  . . . 'BEGIN {length = ARGV[1]} . . .'

Einfache Beispiele

$ sed 3q /etc/passwd | \
 awk -F: '{ print $1 }'
$ awk '{ print NR, $0 }'
$ awk '{ printf "%4d %s\n", NR, $0 }'
$ awk '{ printf "\t%s\n", $0 }'

Beispiele zu den Mustern

awk -F: '$2 == ""' /etc/passwd
$2 == ""
$2 ~ /^$/
$2 !~ /./
length($2) == 0
NF % 2 != 0
length($0) > 72 {
   print "Line", NR, "too long:",
      substr($0, 1, 60)
}
$ date | awk '{print substr($4, 1, 5)}'

Beispiele zu den BEGIN- und END-Mustern

$ awk 'BEGIN { FS = ":" }         gleich wie -F 
 $2 == "" ' /etc/passwd
$
$ awk 'END { print NR }' . . .    == wc -l

Arithmetik und Variablen (Einführende Beispiele)

{s = s + $1}
END {print s}
{s += $1}
END {print s, s/NR}
{
   nc += length($0) + 1
   nw += NF
}
END {print NR, nw, nc}
$ wc filenames . . . | awk '!/ total$/ {
   n += int (($1+55)/56)
}
END { print n } '
$

Arrays

awk '
{ line[NR] = $0 }
END {
   for ( i = NR; i > 0; i-- )
      print line[i]
}
' $*
$ sed 1q /etc/passwd | \
 awk '{split($0, a, ":"); print a[1]}'
$ echo 5/10/86 | \
 awk '{split($0, date, "/"); print date[3]}'

Assoziative Arrays

Susie 400
John  100
Mary  200
Mary  300
John  100
Susie 100
Mary  100

{sum[$1] += $2}
END {for (name in sum) print name, sum[name]}

John  200
Susie 500
Mary  600

Beispiele zu den Assoziativen Arrays

awk '{ for (i = 1; i <= NF; i++) num[$i]++ }
END { for (word in num) print word, num[word] }'
$ sed 's/->/    /g' | awk '
BEGIN {
   N = 80
   for (i = 1; i <= N; i++) blanks = blanks " "
}
{
   if ((n = length($0)) <= N) print
   else {
      for (i = 1; n > N; n -= N) {
         printf "%s\\\n", substr($0,i,N)
         i += N;
      }
      printf "%s%s\n",substr(blanks,1,N-n),substr($0,i)
   }
} '

Beispiele zur Interaktion mit dem Shell-Programm

$ name arg1 arg2 arg3 . . . arg9 arg10 . . .
  name $1   $2   $3         $9
$ awk '{print $'$1'}' . . .
$ awk "{print \$$1}" . . .
$ awk '{s += $'$1'}
 END {print s}'
$ awk '
BEGIN {
   n = '$1'
}
{
   for (i = 1; i <= n; i++) sum[i] += $i
}
END {
   for (i = 1; i <= n; i++) {
      printf "%6g ", sum[i]
      total += sum[i]
   }
   printf "; total = %6g\n", total
}'

Kalender Beispiel

$ awk < $HOME/calendar '
BEGIN {
   x = "Jan 31 Feb 28 Mar 31 Apr 30 May 31 Jun 30 " \
   "Jul 31 Aug 31 Sep 30 Oct 31 Nov 30 Dec 31 Jan 31"
   split(x, data)
   for (i = 1; i < 24; i += 2) {
      days[data[i]] = data[i+1]
      nextmon[data[i]] = data[i + 2]
   }
   #split("'"`date`"'", date)           old & ungly!
   "date" | getline; split($0, date)    new & nice!
   mon1 = date[2]; day1 = date[3]
   mon2 = mon1; day2 = day1 + 1
   if (day1 = days[mon1]) {
      day2 = 1
      mon2 = nextmon[mon1]
   }
}
$1 == mon1 && $2 == day1 || $1 == mon2 && $2 == day2
' | mail $NAME


$ cat ~adamov/calendar
Oct 17 Mother's Birthday
Nov 21 Project Meeting
Dec 1 Parnas' Talk
$


$ cat early.morning
calendar
echo early.morning | at 5am
$

LANsys 15.03.2004