BEGINFILE/ENDFILE (The GNU Awk User’s Guide)
7.1.5 The BEGINFILE and ENDFILE Special Patterns
This section describes a
Two special kinds of rule,
ENDFILE, give you “hooks” into
gawk’s command-line file processing loop. As with the
END rules (see section The BEGIN and END Special Patterns), all
BEGINFILE rules in a program are merged, in the order they are read by
gawk, and all
ENDFILE rules are merged as well.
The body of the
BEGINFILE rules is executed just before
gawk reads the first record from a file.
FILENAME is set to the name of the current file, and
FNR is set to zero.
BEGINFILE rule provides you the opportunity to accomplish two tasks that would otherwise be difficult or impossible to perform:
- You can test if the file is readable. Normally, it is a fatal error if a file named on the command line cannot be opened for reading. However, you can bypass the fatal error and move on to the next file on the command line. You do this by checking if the ERRNO variable is not the empty string; if so, then gawk was not able to open the file. In this case, your program can execute the nextfile statement (see section The nextfile Statement). This causes gawk to skip the file entirely. Otherwise, gawk exits with the usual fatal error.
- If you have written extensions that modify the record handling (by inserting an “input parser”; see section Customized Input Parsers), you can invoke them at this point, before
gawkhas started processing the file. (This is a very advanced feature, currently used only by the gawkextlib project.)
ENDFILE rule is called when
gawk has finished processing the last record in an input file. For the last input file, it will be called before any
END rules. The
ENDFILE rule is executed even for empty input files.
Normally, when an error occurs when reading input in the normal input-processing loop, the error is fatal. However, if an
ENDFILE rule is present, the error becomes non-fatal, and instead
ERRNO is set. This makes it possible to catch and process I/O errors at the level of the
next statement (see section The next Statement) is not allowed inside either a
BEGINFILE or an
ENDFILE rule. The
nextfile statement is allowed only inside a
BEGINFILE rule, not inside an
getline statement (see section Explicit Input with getline) is restricted inside both
ENDFILE: only redirected forms of
getline are allowed.
gawk extensions. In most other
awk implementations, or if
gawk is in compatibility mode (see section Command-Line Options), they are not special.