The following functions are related to Input/Output (I/O). Optional parameters are enclosed in square brackets ("[" and "]").
close(filename)
fflush([filename])
fflush
function; gawk
too
buffers its output, and the fflush
function can be used to force
gawk
to flush its buffers.
fflush
is a recent (1994) addition to the Bell Labs research
version of awk
; it is not part of the POSIX standard, and will
not be available if `--posix' has been specified on the command
line (see section Command Line Options).
gawk
extends the fflush
function in two ways. The first
is to allow no argument at all. In this case, the buffer for the
standard output is flushed. The second way is to allow the null string
(""
) as the argument. In this case, the buffers for
all open output files and pipes are flushed.
fflush
returns zero if the buffer was successfully flushed,
and nonzero otherwise.
system(command)
awk
program. The system
function
executes the command given by the string command. It returns, as
its value, the status returned by the command that was executed.
For example, if the following fragment of code is put in your awk
program:
END { system("date | mail -s 'awk run done' root") }the system administrator will be sent mail when the
awk
program
finishes processing input and begins its end-of-input processing.
Note that redirecting print
or printf
into a pipe is often
enough to accomplish your task. However, if your awk
program is interactive, system
is useful for cranking up large
self-contained programs, such as a shell or an editor.
Some operating systems cannot implement the system
function.
system
causes a fatal error if it is not supported.
As a side point, buffering issues can be even more confusing depending upon whether or not your program is interactive, i.e., communicating with a user sitting at a keyboard.(13)
Interactive programs generally line buffer their output; they write out every line. Non-interactive programs wait until they have a full buffer, which may be many lines of output.
Here is an example of the difference.
$ awk '{ print $1 + $2 }' 1 1 -| 2 2 3 -| 5 Control-d
Each line of output is printed immediately. Compare that behavior with this example.
$ awk '{ print $1 + $2 }' | cat 1 1 2 3 Control-d -| 2 -| 5
Here, no output is printed until after the Control-d is typed, since
it is all buffered, and sent down the pipe to cat
in one shot.
system
The fflush
function provides explicit control over output buffering for
individual files and pipes. However, its use is not portable to many other
awk
implementations. An alternative method to flush output
buffers is by calling system
with a null string as its argument:
system("") # flush output
gawk
treats this use of the system
function as a special
case, and is smart enough not to run a shell (or other command
interpreter) with the empty command. Therefore, with gawk
, this
idiom is not only useful, it is efficient. While this method should work
with other awk
implementations, it will not necessarily avoid
starting an unnecessary shell. (Other implementations may only
flush the buffer associated with the standard output, and not necessarily
all buffered output.)
If you think about what a programmer expects, it makes sense that
system
should flush any pending output. The following program:
BEGIN { print "first print" system("echo system echo") print "second print" }
must print
first print system echo second print
and not
system echo first print second print
If awk
did not flush its buffers before calling system
, the
latter (undesirable) output is what you would see.
Go to the first, previous, next, last section, table of contents.