Awk scripts consist of patterns and procedures:
pattern
{procedure
}
Both are optional. If pattern
is missing,
{procedure
} is applied to all lines.
If {procedure
} is missing, the matched line
is printed.
A pattern can be any of the following:
/
regular expression
/
relational expression
pattern-matching expression
BEGIN
END
Expressions can be composed of quoted strings, numbers, operators, functions, defined variables, or any of the predefined variables described later under "Awk System Variables".
Regular expressions use the extended set of metacharacters and are described in Section 6.
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 line.
Relational expressions use the relational operators listed under "Operators" later in this section. 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 section.
The BEGIN pattern lets you specify procedures that will take
place before
the first input line is processed. (Generally, you
set global variables here.)
The END pattern lets you specify procedures that
will take place after
the last input record is read.
Except for BEGIN and END, patterns can be combined with the Boolean operators || (or), && (and), and ! (not). A range of lines can also be specified using comma-separated patterns:
pattern
,pattern
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
Print first field of each line:
{ print $1 }
Print all lines that contain pattern
:
/pattern
/
Print first field of lines that contain pattern
:
/pattern
/{ print $1 }
Select records containing more than two fields:
NF > 2
Interpret input records as a group of lines up to a blank line:
BEGIN { FS = "\n"; RS = "" }
Print fields 2 and 3 in switched order, but only on lines whose first field matches the string "URGENT":
$1 ~ /URGENT/ { print $3, $2 }
Count and print the number of pattern
found:
/pattern
/ { ++x } END { print x }
Add numbers in second column and print total:
{total += $2 }; END { print "column total is", total}
Print lines that contain less than 20 characters:
length < 20
Print each line that begins with
Name:
and that contains exactly seven fields:
NF == 7 && /^Name:/
Reverse the order of fields:
{ for (i = NF; i >= 1; i-) print $i }