到目前為止我們輸出的數(shù)據(jù)都是輸出到標(biāo)準(zhǔn)輸出流中。不過我們也可以將數(shù)據(jù)輸出重定向到文件中。重定向操作往往出現(xiàn)在 print 或者 printf 語(yǔ)句中。 AWK 中的重定向方法與 shell 重定向十分相似,除了 AWK 重定向只用于 AWK 程序中外。本章節(jié)將講述重定向的使用方法:
重定向操作符的使用方法如下:
print DATA > output-file
上面重定向操作將輸出數(shù)據(jù)重定向到 output-file 中。如果 output-file 文件不存在,則先創(chuàng)建該文件。使用這種重定向方式時(shí),數(shù)據(jù)輸出前會(huì)將 output-file 文件中原有的數(shù)據(jù)刪除。下面的示例將 Hello,World!!! 消息重定向輸出到文件中。
先創(chuàng)建文件并在文件中輸入一些數(shù)據(jù)。
[jerry]$ echo "Old data" > /tmp/message.txt
[jerry]$ cat /tmp/message.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
Old data
再用 AWK 重定向操作符重定向數(shù)據(jù)到文件 message.txt 中。
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
[jerry]$ cat /tmp/message.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
Hello, World !!!
追加重定向操作符的語(yǔ)法如下:
print DATA >> output-file
用這種重定向方式將數(shù)據(jù)追加到 output-file 文件的末尾。如果文件不存在則先創(chuàng)建該文件。示例如下:
創(chuàng)建文件并輸入一些數(shù)據(jù):
[jerry]$ echo "Old data" > /tmp/message.txt
[jerry]$ cat /tmp/message.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
Old data
再使用 AWK 追加操作符追加內(nèi)容到文件中:
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
[jerry]$ cat /tmp/message.txt
執(zhí)行上面的命令可以得到如下的結(jié)果:
Old data
Hello, World !!!
除了使用文件在程序之間傳遞數(shù)據(jù)之外,AWK 還提供使用管道將一個(gè)程序的輸出傳遞給另一個(gè)程序。這種重定向方式會(huì)打開一個(gè)管道,將對(duì)象的值通過管道傳遞給管道另一端的進(jìn)程,然后管道另一端的進(jìn)程執(zhí)行命令。下面是管道的使用方法:
print items | command
下面的例子中我們使用 tr 命令將小寫字母轉(zhuǎn)換成大寫。
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
HELLO, WORLD !!!
AWK 允許使用 |& 與一個(gè)外部進(jìn)程通信,并且可以雙向通信。下面的例子中,我們?nèi)匀皇褂?tr 命令將字母轉(zhuǎn)換為大寫字母。 command.awk 文件內(nèi)容如下:
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd
close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}
執(zhí)行上面的命令可以得到如下的結(jié)果:
HELLO, WORLD !!!
腳本的內(nèi)容看上去很神秘嗎?讓我們一步一步揭開它神秘的面紗。