8.4 Pattern und Operatoren

AWK ist eine zeilenorientierte Sprache, sie verwendet pattern und actions. awk pattern werden zur Beschreibung der Bedingung verwendet, unter der eine action ausgeführt werden soll.
  • fehlt pattern, so wird der Aktionsteil für jeden Satz durchgeführt
  • fehlt der Aktionsteil, so wird der Satz ausgegeben.
  • Folgende pattern können verwendet werden:
    
          BEGIN
          END
          /regular expression/
          relational expression
          pattern && pattern
          pattern || pattern
          pattern ? pattern : pattern
          (pattern)
          ! pattern
          pattern1, pattern2
    


    8.4.1 BEGIN END

  • BEGIN und END sind zwei besondere Patterns. Sie werden nicht mit dem Input verglichen. sondern unabhängig davon ausgeführt. Es können mehrere BEGIN und END definiert werden.
  • BEGIN und END können nicht mit anderen Pattern verknüpft werden.
  • Sind mehrere BEGIN oder END pattern vorhanden, dann werden ihre Aktionsteile so zusammengefaßt, als ob sie jeweils in einer Aktion geschrieben wären. BEGIN und END patterns müssen einen Aktionsteil haben oder ganz weggelassen werden.
    Beispiele:
        # Anzahl der Sätze ausgeben
             END     { print NR }   
    
       # Anzahl aller Zeichen ausgeben
          	        { nc += length($0) } 	# $0 ist kompletter Satz, davon length ohne  \n
    	END     { print  nc + NR  } 	# Zeichenanzahl + Anzahl der Sätze
        


    8.4.2 Metazeichen in /regular expression/ pattern

  • /regular expression/ Der zugehörige Aktionsteil wird für jede Eingabezeile
    durchgeführt, auf die der RE zutrifft. Als RE können alle extended Formen verwendet
    werden, die auch in egrep Anwendung finden.
  • Innerhalb eines RE sind die Zeichen \ ^ $ . [ ] + ? () | Metazeichen. Sie haben für den awk eine spezielle Bedeutung.
    Sollen sie als normale Zeichen verwendet werden, so sind sie durch einen \ zu maskieren.
  • 
    c          	matches das non-Metazeichen c.
    
    ^          	der RE beginnt am Anfang einer Zeile oder eines Strings	/^d/
    
    $          	der RE steht am Ende einer Zeile oder eines Strings		/test$/
    
    .           	steht für jedes Zeichen (Ausnahme newline).			/^.....w/
    
    \c         	Quoten des Metazeichen c, ergibt das Literalzeichen c.		/^\./
    
    [abc]   		Character Class, jedes der Zeichen abc			   	/[ xyzabc]/
    [a-zA-Z]		Bereiche werden durch Bindestrich gebildet
    
    [^abc]  		Negation der Character Class, jedes Zeichen das nicht
    		abc   oder newline ist.
    
    re1|re2    	Alternation: steht für entweder  re1 oder re2.			/root|hahn/
    
    re1re2      	Concatenation:   erst  re1, und dann  re2. 			/[abc][0-9]/
    
    re+         	steht für ein oder mehrere  re's.				 /[0-9]+/
    
    re*         	steht für Null  oder mehrere re's.				 /[0-9]*/
    
    re?         	steht für Null oder ein re's.					 /[0-9]?/
    
    (re)        	Zusammenfassung von  re.					 /(,[ \t])|([ \t])/
    
    Escapesequenzen die in Strings verwendet werden dürfen, können auch in RE verwendet werden.
    \\ 		backslash
    \a		alert                 		(im Regelfall  ASCII BEL Zeichen)
    \b		backspace
    \f		formfeed
    \n		newline
    \r		carriage return
    \t		horizontal tab
    \v		vertical tab
    \ddd	octal value ddd
    \xhh	hex-digits		       		z.B.  "\x1B"  für ASCII ESC Zeichen
    \"		quotation mark
    \c		jedes andere Zeichen
    
         Escapesequenzen können auch in Zeichenklassen verwendet werden.
         /[ \t\f\n\r\v]/  trifft zu für alle 'white space'
    
         Achtung : wird der vorstender RE einem String zugewiesen der als RE verwendet
    		werden soll, dann muß jeder \ als \\ geschrieben werden.
            		re = "[ \\t\\f\\n\\r\\v]"
            			$3 ~  re { print $3 }
    


    8.4.3 Relational Expression

    Relational Expression vergleichen i.d.R. den Inhalt von Feldern gegen einen RE. Dabei können alle Operatoren benutzt werden, die auch in einer Aktion verwendet werden k�nnen.
    Operator	Funktion		Beipiel
    ~	enthält			ls -l | awk ' $1 ~  /^d/ {print $1, $9} '
    !~	enthält  nicht		ls -l | awk ' $1 !~ /^d/ {print $1, $9} '
    >	größer als		ls -l | awk ' $5 > 30000 '
    >=	größer gleich		ls -l | awk ' $2 >= 2 '
    == 	gleich			ls -l | awk ' $3 == /root/ '
    <	kleiner als		ls -l | awk ' $2 < 2 '
    <=	kleiner gleich		ls -l | awk ' $5 <= 1024 '
    !=	ungleich		ls -l | awk ' $3 != /root/ '
    
    awk interpretiert Strings auf der rechten Seite von  ~  oder !~ als Regular Expression.
    Sollen mit \ maskierte Metazeichen in einem String abgelegt werden um Sie als RE zu
    verwenden,  dann müssen in dem String 2 \\ geschrieben werden.
                    Pattern   			String
                    x  ~  /a\$/			x  ~  "a\\$"
                    x  ~  /a$/			x  ~  "a\$"
                    x  ~  /\t/			x  ~  "\\t"
    


    8.4.4 Verküpfung von Relational Expression

    Relational Expression können über die Operatoren && || sowie ! verknüpft werden.
    Die Auswertung dieser Operatoren erfolgt im Kurzschlussverfahren.
    Klammern können gesetzt werden, um die Auswertungsreihenfolge zu beeinflußen.
    Operator	Funktion			Beispiel
    && 	logisch-UND			ls -l | awk '$5 > 1024 && $3 != "root" '
    || 	logisch-ODER			ls -l | awk '$3 ~ "root"   ||  $3 ~ "hahn" '
    !	logisch-NOT			ls -l | awk ' $3 ~  ! "root"  '
    

    8.4.5 tenärer Operator ? :

    Der ? : Operator formuliert eine Bedingung und eine Unterbedingung.
         pattern1 ? pattern2 : pattern3
    Wenn pattern1 zutrifft, wird mit pattern2 getestet, andernfalls mit pattern3.
    Nur eines der Pattern 2 oder 3 wird evaluiert.
     


    8.4.6 pattern1 , pattern2 Patternbereich

    Die Form pattern1, pattern2 bezeichnet einen Pattern-Bereich. Er trifft alle Sätze zu,
    die mit pattern1 beginnen und erstreckt sich bis zu dem Satz der pattern2 enthält (inclusiv).
    Diese Form darf nicht mit einem anderen Regular Expression kombiniert werden.
    awk '/^# Modif/,/^#_==/' $1 | more        # gibt alle Sätze in dem Bereich aus
    
    cat name.js | awk '/^[ \\t]*\/\*/,  /^.*\*\//'  # gibt alle   /*  Kommentarzeilen  */  
                                             # der Javascriptdatei  name.js aus
                        ^                    # Bereichanfang begint ab Zeilenanfang 
                        [ \\t]*              # Zeile startet mit Blank oder Tab  0 bis n 
                        \/\*                 # gefolgt von /*  müssen beide per \ escaped werden, 
                                             # da beide Zeichen Metazeichen sind
                                 .*\*\/      # Kennzeichnet Ende des Bereiches hier  
                                             #  .* beliebige Zeichen 
                                             # gefolgt von */