So far, we displayed data on standard output stream. We can also redirect data to a file. A redirection appears after the print or printf statement. Redirections in AWK are written just like redirection in shell commands, except that they are written inside the AWK program. This chapter explains redirection with suitable examples.
The syntax of the redirection operator is −
print DATA > output-file
It writes the data into the output-file. If the output-file does not exist, then it creates one. When this type of redirection is used, the output-file is erased before the first output is written to it. Subsequent write operations to the same output-file do not erase the output-file, but append to it. For instance, the following example writes Hello, World !!! to the file.
Let us create a file with some text data.
[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt
On executing this code, you get the following result −
Old data
Now let us redirect some contents into it using AWK's redirection operator.
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt
On executing this code, you get the following result −
Hello, World !!!
The syntax of append operator is as follows −
print DATA >> output-file
It appends the data into the output-file. If the output-file does not exist, then it creates one. When this type of redirection is used, new contents are appended at the end of file. For instance, the following example appends Hello, World !!! to the file.
Let us create a file with some text data.
[jerry]$ echo "Old data" > /tmp/message.txt [jerry]$ cat /tmp/message.txt
On executing this code, you get the following result −
Old data
Now let us append some contents to it using AWK's append operator.
[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }' [jerry]$ cat /tmp/message.txt
On executing this code, you get the following result −
Old data Hello, World !!!
It is possible to send output to another program through a pipe instead of using a file. This redirection opens a pipe to command, and writes the values of items through this pipe to another process to execute the command. The redirection argument command is actually an AWK expression. Here is the syntax of pipe −
print items | command
Let us use tr command to convert lowercase letters to uppercase.
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
On executing this code, you get the following result −
HELLO, WORLD !!!
AWK can communicate to an external process using |&, which is two-way communication. For instance, the following example uses tr command to convert lowercase letters to uppercase. Our command.awk file contains −
BEGIN { cmd = "tr [a-z] [A-Z]" print "hello, world !!!" |& cmd close(cmd, "to") cmd |& getline out print out; close(cmd); }
On executing this code, you get the following result −
HELLO, WORLD !!!
Does the script look cryptic? Let us demystify it.
The first statement, cmd = "tr [a-z] [A-Z]", is the command to which we establish the two-way communication from AWK.
The next statement, i.e., the print command provides input to the tr command. Here &| indicates two-way communication.
The third statement, i.e., close(cmd, "to"), closes the to process after competing its execution.
The next statement cmd |& getline out stores the output into out variable with the aid of getline function.
The next print statement prints the output and finally the close function closes the command.