鍍金池/ 教程/ Linux/ 輸出重定向
循環(huán)  
操作符  
優(yōu)雅地輸出
用戶自定義函數(shù)
正則表達(dá)式
基本示例
內(nèi)置函數(shù)
工作流程
概述
控制流  
數(shù)組  
輸出重定向
基本語(yǔ)法
運(yùn)行環(huán)境
內(nèi)置變量

輸出重定向

到目前為止我們輸出的數(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)容看上去很神秘嗎?讓我們一步一步揭開它神秘的面紗。

  • 第一條語(yǔ)句 cmd = "tr [a-z] [A-Z]" 在AWK 中建立了一個(gè)雙向的通信通道。
  • 第二條語(yǔ)句 print 為 tr 命令提供輸入。&| 表示雙向通信。
  • 第三條語(yǔ)句 close(cmd, "to") 執(zhí)行后關(guān)閉 to 進(jìn)程。
  • 第四條語(yǔ)句 cmd |& getline out 使用 getline 函數(shù)將輸出存儲(chǔ)到 out 變量中。
  • 接下來的輸出語(yǔ)句打印輸出的內(nèi)容,最后 close 函數(shù)關(guān)閉 cmd。