awk中使用shell命令

awk程序中容許使用Shell指令,使用管道在awk和系統中進行數據傳遞,因此awk能夠很容易的使用系統資源。 
  好比寫一個awk程序來打印出當前系統上有多少用戶登陸。awk的腳本文件名爲usernumber.awk,腳本內容以下:
[root@benet pub]# cat usernumber.awk
#!/bin/awk -f
BEGIN{
while(「who」|getline) n++;
print n;
}
    執行結果以下:
[root@benet pub]# awk -f usernumber.awk
2 #即有兩個用戶登陸了系統

    解釋:awk 程序並不必定要處理數據文件,上例中沒有輸入任何數據文件。BEGIN 和END是awk 中的一種Pattern。以BEGIN 爲Pattern的Actions,只有在awk開始執行程序,還沒有輸入任何文件前,執行一次且僅被執行一次) ,「|」和在shell中同樣,在awk中也表示管道。awk把|以前的字符串「who」當成Shell的命令,並將該命令送往Shell執行,執行的結果經過管道輸出到awk程序中。
    getline爲awk所提供的輸入指令。getline 一次讀取一行數據,若讀取成功則return 1,若讀取失敗則return -1,若遇到文件結束(EOF),則return 0;
    getline的用法和例子:
    當getline左右沒有重定向符|或<時,getline讀去當前文件的第一行並將數據保存到變量中,若是沒有變量,則數據保存到$0中;因爲awk在處理getline以前已經讀入了一行,因此getline獲得的返回結果是隔行的。
    當getline左右有重定向符|或<時,getline做用於定向輸入文件,因爲該文件是剛打開,awk並無讀入一行數據,而getline讀入了一行數據,那麼getline返回的是該文件的第一行,而不是隔行。
root@myfreelinux pub]# awk ‘BEGIN{「cat kecheng.dat」|getline var;print var;}’
[root@myfreelinux pub]# awk ‘BEGIN{「cat kecheng.dat」|getline;print $0;}’
[root@myfreelinux pub]# awk ‘BEGIN{getline var<」kecheng.dat」;print var;}’
[root@myfreelinux pub]# awk ‘BEGIN{getline <」kecheng.dat」;print $0;}’
    以上四行awk程序都是將kecheng.dat的第一行數據打印出來,結果是:zhangsan math english chinese
[root@myfreelinux pub]# awk ‘{getline var;print $0;print var;}’ kecheng.dat
zhangsan math english chinese
lisi     computer chinese english
wangwu dianzi chinese math
zhaoliu huanjing english chinese
[root@myfreelinux pub]# awk ‘{getline var;print var;}’ kecheng.dat
lisi     computer chinese english
zhaoliu huanjing english chinese
    以上兩個例子能夠看出來,awk和getline是分別取數據文件中的行數據,並且是awk首先從數據文件中取數據,後getline取下一行數據。
getlin在不一樣環境下影響到awk中的值的對應關係以下圖: ————————————————- 形式                            設置 ————————————————- getline                        $0,NF,NR,FNR getline var                  var,NR,FNR getline<file                  $0,$1…$NF,NF getline var<file            var cmd|getline                 $0,NF cmd|getline var           var ————————————————
相關文章
相關標籤/搜索