|
Chapter 11 The Awk Scripting Language
|
|
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:
-
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 }
|
|