Using BEGIN/END (The GNU Awk User’s Guide)
Next: I/O And BEGIN/END, Up: BEGIN/END [Contents][Index]
7.1.4.1 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 \"li\"" } > /li/ { ++n } > END { print "\"li\" appears in", n, "records." }' mail-list -| Analysis of "li" -| "li" appears in 4 records.
This program finds the number of records in the input file mail-list
that contain the string ‘li
’. 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, as awk
does this automatically (see section Variables). The second rule increments the variable n
every time a record containing the pattern ‘li
’ 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. See section Command-Line Options for more information on using library functions. See section A Library of awk Functions, for a number of useful library functions.
If an awk
program has only BEGIN
rules and no other rules, then the program exits after the BEGIN
rules are run.38 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
(38)
The original version of awk
kept reading and ignoring input until the end of the file was seen.
Next: I/O And BEGIN/END, Up: BEGIN/END [Contents][Index]