awk 程式中使用 Shell 命令

2021-06-14 03:23:02 字數 1417 閱讀 2885

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 ''

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

awk 'begin'

說明: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)

AWK程式中使用Shell命令

awk程式中允許呼叫shell指令,並提供管道解決awk與系統間資料傳遞的問題。所以awk很容易使用系統資源,讀者可利用這個特點來編寫某些適用的系統工具。範例 寫乙個awk程式來列印出線上人數。將下列程式建檔案,命名為 count.awk begin 並執行下列命令 awk f count.awk ...

awk中使用shell變數

其實在awk裡,是不能直接使用shell變數的 方法是 awk v 選項讓awk 裡使用shell變數 time 60 awk v time time begin 這樣要注意 在awk裡,time不能加 符號。網上說如下方法都可行 一 var 這種寫法大家無需改變用 括起awk程式的習慣,是老外常用...

awk中使用shell變數

1 通過命令列引數定義變數時引用 awk v awk變數名 shell變數名 bin bash var4bash test awk v var4awk var4bash begin 2 在awk中直接引用,使用 var 注意使用前格式必須是先用單引號括住再用雙引號括住 bin bash var te...