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、字元串一定要用雙引号。