Startup and Cleanup Actions
...........................
A `BEGIN' rule is executed once only, before the first input record
is read. Likewise, an `END' rule is executed once only, after all the
input is read. For example:
$ awk '
> BEGIN { print "Analysis of \"foo\"" }
> /foo/ { ++n }
> END { print "\"foo\" appears", n, "times." }' BBS-list
-| Analysis of "foo"
-| "foo" appears 4 times.
This program finds the number of records in the input file `BBS-list'
that contain the string `foo'. The `BEGIN' rule prints a title for the
report. There is no need to use the `BEGIN' rule to initialize the
counter `n' to zero, since `awk' does this automatically (Note:Variables). The second rule increments the variable `n' every time a
record containing the pattern `foo' is read. The `END' rule prints the
value of `n' at the end of the run.
The special patterns `BEGIN' and `END' cannot be used in ranges or
with Boolean operators (indeed, they cannot be used with any operators).
An `awk' program may have multiple `BEGIN' and/or `END' rules. They
are executed in the order in which they appear: all the `BEGIN' rules
at startup and all the `END' rules at termination. `BEGIN' and `END'
rules may be intermixed with other rules. This feature was added in
the 1987 version of `awk' and is included in the POSIX standard. The
original (1978) version of `awk' required the `BEGIN' rule to be placed
at the beginning of the program, the `END' rule to be placed at the
end, and only allowed one of each. This is no longer required, but it
is a good idea to follow this template in terms of program organization
and readability.
Multiple `BEGIN' and `END' rules are useful for writing library
functions, because each library file can have its own `BEGIN' and/or
`END' rule to do its own initialization and/or cleanup. The order in
which library functions are named on the command line controls the
order in which their `BEGIN' and `END' rules are executed. Therefore
you have to be careful when writing such rules in library files so that
the order in which they are executed doesn't matter. Note:Command-Line Options, for more information on using library
functions. Note:A Library of `awk' Functions, for
a number of useful library functions.
If an `awk' program only has a `BEGIN' rule and no other rules, then
the program exits after the `BEGIN' rule is run.(1) However, if an
`END' rule exists, then the input is read, even if there are no other
rules in the program. This is necessary in case the `END' rule checks
the `FNR' and `NR' variables.
---------- Footnotes ----------
(1) The original version of `awk' used to keep reading and ignoring
input until end of file was seen.