天天看點

22、awk程式設計

1、BEGIN子產品,通常用來改變内建變量的值,如 OFS,RS和FS等,以及列印标題。如:

awk 'BEGIN{FS=" ";OFS="\t";ORS="\n"}{print $1,$2,$3}' file //輸入域分隔符為空格,輸出域分隔符為tab,記錄分隔符為\n。

$awk 'BEGIN{print "TITLE TEST"}

2、END在整個輸入檔案處理完成後被執行。如

$awk 'END{print "The number of records is" NR}' test  //列印被處理的記錄數

3、重定向

awk '$1==100{print $1 > "out"}' test.cpp

4、管道

1)awk 'BEGIN{"date" | getline d; print d}' test.cpp //執行linux的date指令,并通過管道輸出給getline,然後再把輸出指派給自定義變量d,并列印它。

getline從标準輸入、管道或者目前正在處理的檔案之外的其他輸入檔案獲得輸入。它負責從輸入獲得下一行的内容,并給NF,NR和FNR等内建變量指派。如果得到一條記錄,getline函數傳回1,如果到達檔案的末尾就傳回0,如果出現錯誤,例如打開檔案失敗,就傳回-1。

2)awk 'BEGIN{"date" | getline d;split(d,mon); print mon[2]}' //split函數把變量d轉化成數組mon,然後列印數組mon的第二個元素

3)awk 'BEGIN{while("ls"|getline)print}'

    循環使getline從ls的輸出中讀取一行,并把它列印到螢幕。這裡沒有輸入檔案,因為BEGIN塊在打開輸入檔案前執行,是以可以忽略輸入檔案。

4)awk 'BEGIN{printf "what is you name?"; getline name < "/dev/tty"}$1~name{print "Found " name on line ","NR"."}' file

5)awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'

6)可以在awk中打開一個管道,且同一時刻隻能有一個管道存在。通過close()可關閉管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awk把print語句的輸出通過管道作為linux指令sort的輸入,END塊執行關閉管道操作。

system函數可以在awk中執行linux的指令。

awk 'BEGIN{system("clear")}'

    fflush函數用以重新整理輸出緩沖區,如果沒有參數,就重新整理标準輸出的緩沖區,如果以空字元串為參數,如fflush(""),則重新整理所有檔案和管道的輸出緩沖區。

5awk '{i=1;while(i<=NF){print NF,$1;i++}}' file

    next語句從輸入檔案中讀取一行,然後從頭開始執行awk腳本

    exit語句用于結束awk程式,但不會略過END塊。退出狀态為0代表成功,非零值表示出錯

6數組

(1)用變量作為數組下标。如:$ awk '{name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test。

輸出數組中元素:

{

for (item in arrayname)

print arrayname[item]

}

    delete函數用于删除數組元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test。

7、内建函數

1)sub函數比對記錄中最大、最靠左邊的子字元串的正規表達式,并用替換字元串替換這些字元串。隻替換一次。

sub (regular expression, substitution string):

sub (regular expression, substitution string, target string)

awk '{ sub(/test/, "mytest"); print }' testfile

2)gsub替換所有。

3)index函數傳回子字元串第一次被比對的位置,偏移量從位置1開始。

index(string, substring)

awk '{print index("socket.h","ck")}' file

4)length函數傳回記錄的字元數

5)子字元串

substr( string, starting position )

substr( string, starting position, length of string )

6)toupper和tolower函數可用于字元串大小間的轉換,該功能隻在gawk中有效

7)split按給定的分隔符把字元串分割為一個數組。如果分隔符沒提供,則按目前FS值進行分割。格式如下:

split( string, array, field separator )

split( string, array )

awk '{ split( "20:18:00", time, ":" ); print time[2] }'

awk '{if (NF==6){split($5,a,"/");if (a[1]>=a[2])print $0}}' *

8)時間函數systime

9)數學函數sin等[1]

10)自定義函數

function name ( parameter, parameter, … )

statements

return expression     # the return statement and expression are optional

8、預設print $0

9、變量不需要定義就可以直接使用,變量類型可以是數字或字元串。

10、字元串一定要用雙引号。

繼續閱讀