Go to the first, previous, next, last section, table of contents.


Built-in Functions for Input/Output

The following functions are related to Input/Output (I/O). Optional parameters are enclosed in square brackets ("[" and "]").

close(filename)
Close the file filename, for input or output. The argument may alternatively be a shell command that was used for redirecting to or from a pipe; then the pipe is closed. See section Closing Input and Output Files and Pipes, for more information.
fflush([filename])
Flush any buffered output associated filename, which is either a file opened for writing, or a shell command for redirecting output to a pipe. Many utility programs will buffer their output; they save information to be written to a disk file or terminal in memory, until there is enough for it to be worthwhile to send the data to the ouput device. This is often more efficient than writing every little bit of information as soon as it is ready. However, sometimes it is necessary to force a program to flush its buffers; that is, write the information to its destination, even if a buffer is not full. This is the purpose of the 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)
The system function allows the user to execute operating system commands and then return to the 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.

Interactive vs. Non-Interactive Buffering

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.

Controlling Output Buffering with 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.