Team LiB   Previous Section   Next Section

13.2 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.2.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:

  • Expressions can be composed of quoted strings, numbers, operators, functions, defined variables, or any of the predefined variables described later under "gawk System Variables."

  • Regular expressions use the extended set of metacharacters and are described in Chapter 9.

  • In addition, ^ and $ can be used to refer to the beginning and end of a field, respectively, rather than the beginning and end of a record.

  • Relational expressions use the relational operators listed under "Operators" later in this chapter. Comparisons can be either string or numeric. For example, $2 > $1 selects lines for which the second field is greater than the first.

  • Pattern-matching expressions use the operators ~ (match) and !~ (don't match). See "Operators" later in this chapter.

  • The BEGIN pattern lets you specify procedures that take place before the first input record is processed. (Generally, you set global variables here.)

  • The END pattern lets you specify procedures that take place after the last input record is read.

  • If there are multiple BEGIN or END patterns, their associated actions are taken in the order in which they appear in the script.

  • pattern,pattern specifies a range of lines. This syntax cannot include BEGIN or END as a pattern.

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 gawk 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 is [[:lower:]], which in English is the same as [a-z]. See Chapter 9 for a complete list of POSIX character lists.

13.2.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:

  • Variable or array assignments

  • Printing commands

  • Built-in functions

  • Control-flow commands

13.2.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 }
    Team LiB   Previous Section   Next Section