awk 程式中使用 Shell 命令

來源:互聯網
上載者:User
awk程式中允許呼叫Shell指令. 並提供管道解決awk與系統間資料傳遞的問題. 所以awk很容易使用系統資源.主要有兩種方式:

a. 文法] awk output 指令 | "Shell 接受的命令"( 如 : print $1,$2 | "sort -k 1" )

[b. 文法] "Shell 接受的命令" | awk input 指令( 如 : "ls " | getline)

注 :

awk input 指令只有 getline 一個.

awk output 指令有 print, printf() 二個.

在a 文法中, awk所輸出的資料將轉送往 Shell , 由 Shell 的命令進行處理.以上例而言, print 所輸出的資料將經由 Shell 命令 "sort -k 1" 排序後再送往螢幕(stdout).

上例awk程式中, "print$1, $2" 可能反覆執行很多次, 其輸出的結果將先暫存於 pipe 中,等到該程式結束時, 才會一併進行 "sort -k 1".

須注意二點 : 

1、不論 print $1, $2 被執行幾次, "sort -k 1" 的執行時間是 "awk程式結束時",

2、"sort -k 1" 的執行次數是 "一次".

 

在 b 文法中, awk將先調用 Shell 命令. 其執行結果將通過 pipe 送入awk程式,以上例而言, awk先讓 Shell 執行 "ls",Shell 執行後將結果存於 pipe, awk指令 getline再從 pipe 中讀取資料.

使用本文法時應留心: 以上例而言,awk "立刻"調用 Shell 來執行 "ls", 執行次數是一次.

getline 則可能執行多次(若pipe中存在多行資料). 

例子:對進程PID進行排序

ps -ef|awk '{print $2|"sort -n"}'

將awk的結果pid值,存到pipe中當程式結束時一次性傳給“sort -n”來進行排序,並輸出到標準輸出,此外可以調用close(“sort -n”)來關閉“sort -n”前的pipe並立刻將“sort -n”交給shell執行。

例子:列印線上人數

awk 'BEGIN{while ("who"|getline) n++;print n}'

列印當前的在線上人數

說明:awk不一定要處理檔案,BEGIN會在尚未開啟任何輸入檔案前,被執行一次,awk把“|”管道符號前面的字串當成shell上的命令,並將命令送往shell,執行結果則由pipe送進awk程式中,getline為awk的提供的輸入指令

文法

由何處讀取資料

資料讀入後置於

getline var < file

所指定的 file

變數 var(var省略時,表示置於$0)

getline var

pipe 變數

變數 var(var省略時,表示置於$0)

 當Pattern 為 BEGIN 或 END 時, getline 將由 stdin 讀取資料, 否則由awk正處理的資料檔案上讀取資料.

getline 一次讀取一行資料, 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到檔案結束(EOF), 則return 0(false)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.