Book HomeLinux in a NutshellSearch this book

13.3. Patterns and Procedures

gawk scripts consist of patterns and procedures:

pattern  {procedure}

Both are optional. If pattern is missing, {procedure} is applied to all records. If {procedure} is missing, the matched record is printed. By default, each line of input is a record, but you can specify a different record separator through the RS variable.

13.3.1. Patterns

A pattern can be any of the following:

/regular expression/
relational expression
pattern-matching expression
pattern,pattern
BEGIN
END

Some rules regarding patterns include:

Except for BEGIN and END, patterns can be combined with the Boolean operators || (OR), && (AND), and ! (NOT).

In addition to other regular-expression operators, GNU awk supports POSIX character lists, which are useful for matching non-ASCII characters in languages other than English. These lists are recognized only within [ ] ranges. A typical use would be [[:lower:]], which in English is the same as [a-z]. See Chapter 9, "Pattern Matching" for a complete list of POSIX character lists.

13.3.2. Procedures

Procedures consist of one or more commands, functions, or variable assignments, separated by newlines or semicolons and contained within curly braces. Commands fall into four groups:

13.3.3. Simple Pattern-Procedure Examples

  1. Print first field of each line (no pattern specified):

    { print $1 }
  2. Print all lines that contain "Linux":

    /Linux/
  3. Print first field of lines that contain "Linux":

    /Linux/{ print $1 }
  4. Print records containing more than two fields:

    NF > 2
  5. Interpret each group of lines up to a blank line as a single input record:

    BEGIN { FS = "\n"; RS = "" }
  6. Print fields 2 and 3 in switched order but only on lines whose first field matches the string "URGENT":

    $1 ~ /URGENT/ { print $3, $2 }
  7. Count and print the number of instances of "ERR" found:

    /ERR/ { ++x }; END { print x }
  8. Add numbers in second column and print total:

    {total += $2 }; END { print "column total is", total}
  9. Print lines that contain fewer than 20 characters:

    length() < 20
  10. Print each line that begins with "Name:" and that contains exactly seven fields:

    NF == 7 && /^Name:/
  11. Reverse the order of fields:

    { for (i = NF; i >= 1; i--) print $i }



Library Navigation Links

Copyright © 2001 O'Reilly & Associates. All rights reserved.