鍍金池/ 教程/ Linux/ AWK輸出重定向
AWK環(huán)境安裝配置
AWK格式化打印
Awk教程
AWK控制流
AWK循環(huán)
AWK用戶自定義函數(shù)
AWK工作流程
AWK數(shù)組
AWK基本語(yǔ)法
AWK基本示例
AWK運(yùn)算符
AWK內(nèi)置函數(shù)
AWK內(nèi)置變量
AWK輸出重定向
AWK正則表達(dá)式

AWK輸出重定向

到目前為止,我們已經(jīng)顯示數(shù)據(jù)在標(biāo)準(zhǔn)輸出流。但是,也可以重定向數(shù)據(jù)到文件。print 或 printf 語(yǔ)句重定向顯示。重定向在AWK寫就像在重定向shell命令,但它們是寫在AWK程序中。下面的這個(gè)教程是解釋重定向例子。

重定向操作

下面給出的是重定向操作的語(yǔ)法。

print DATA > output-file

此重定向?qū)?shù)據(jù)寫入輸出文件。如果輸出文件不存在,那么它被創(chuàng)建。當(dāng)使用這種類型的重定向時(shí),之前的第一個(gè)輸出被寫入到它的輸出文件將被刪除。隨后寫入同一個(gè)輸出文件不刪除輸出文件,只會(huì)追加到文件。比如下面的例子中寫道:Hello, World !!! 消息到該文件。

讓我們創(chuàng)建一些文本數(shù)據(jù)的文件。

[jerry]$ echo "Old data" > /tmp/message.txt 
[jerry]$ cat /tmp/message.txt

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

Old data

現(xiàn)在讓我們重定向某些內(nèi)容到文件,使用AWK的重定向操作。

[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
[jerry]$ cat /tmp/message.txt

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

Hello, World !!!

追加操作

下面給出的是追加操作的語(yǔ)法:

print DATA >> output-file

這種重定向追加數(shù)據(jù)到輸出文件output-file。如果輸出文件不存在,那么它被創(chuàng)建。當(dāng)使用這種類型的重定向時(shí),新的內(nèi)容被附加在文件的結(jié)尾。比如下面追加的例子 >Hello, World !!!

讓我們創(chuàng)建一些文本數(shù)據(jù)的文件。

[jerry]$ echo "Old data" > /tmp/message.txt 
[jerry]$ cat /tmp/message.txt

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

Old data

現(xiàn)在讓我們用AWK的追加操作,加追加一些內(nèi)容吧。

[jerry]$ awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }'
[jerry]$ cat /tmp/message.txt

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

Old data
Hello, World !!!

管道

通過(guò)管道來(lái)發(fā)送代替使用文件輸出到另一個(gè)程序。這種重定向打開(kāi)一個(gè)管道命令,并通過(guò)這個(gè)管道寫入項(xiàng)的值,以另一種方法來(lái)執(zhí)行命令。重定向參數(shù)命令實(shí)際上是一個(gè)AWK表達(dá)式。下面給出是管道的語(yǔ)法。

print items | command

讓我們用tr命令,以小寫字母轉(zhuǎn)換為大寫。

[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

HELLO, WORLD !!!

雙向通信

AWK可以通信使用一個(gè)外部進(jìn)程|&,這是雙向通信。比如下面的例子中使用tr命令,以小寫字母轉(zhuǎn)換為大寫。我們 command.awk 文件看起來(lái)是這樣的:

BEGIN {
	cmd = "tr [a-z] [A-Z]"
	print "hello, world !!!" |& cmd
	close(cmd, "to")
	cmd |& getline out
	print out;
	close(cmd);
}

在執(zhí)行上面的代碼后,會(huì)得到以下結(jié)果:

HELLO, WORLD !!!

有點(diǎn)暈了沒(méi)有?讓我們一步步來(lái)分析上面的代碼:

第一條語(yǔ)句, cmd = "tr [a-z] [A-Z]" - 是打算從AWK建立雙向通信的命令。

下面的語(yǔ)句即打印命令,提供輸入到tr命令。此處&| 指示雙向通信。

第三條語(yǔ)句即 close(cmd, "to") - 關(guān)閉完成其執(zhí)行后處理。

下一條語(yǔ)句 cmd |& getline out 存儲(chǔ)在輸出入出變量具有g(shù)etline函數(shù)功能。

接下來(lái)print語(yǔ)句打印輸出,并最終執(zhí)行close函數(shù)關(guān)閉命令。