awk腳本基本結構shell
awk 'BEGIN{ print "start" }pattern{ commands }END{ print "end" }' file
一個awk腳本一般由:BEGIN語句塊、可以使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分均可以不出如今腳本中,腳本一般是被單引號或雙引號中,例如:數組
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
awk的工做原理函數
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:執行BEGIN{ commands }語句塊中的語句;工具
第二步:從文件或標準輸入(stdin)讀取一行,而後執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最後一行重複這個過程,直到文件所有被讀取完畢。spa
第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。命令行
BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中。code
END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,它也是一個可選語句塊。字符串
pattern語句塊中的通用命令是最重要的部分,它也是可選的。若是沒有提供pattern語句塊,則默認執行{ print },即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊。it
示例awk
echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' Start A line 1 A line 2 End
當使用不帶參數的print時,它就打印當前行,當print的參數是以逗號進行分隔時,打印時則以空格做爲定界符。在awk的print語句塊中雙引號是被看成拼接符使用,例如:
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' v1 v2 v3
雙引號拼接使用:
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
{ }相似一個循環體,會對文件中的每一行進行迭代,一般變量初始化語句(如:i=0)以及打印文件頭部的語句放入BEGIN語句塊中,將打印的結果等語句放在END語句塊中。
awk內置變量(預約義變量)
說明:[A][N][P][G]表示第一個支持變量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
$n 當前記錄的第n個字段,好比n爲1表示第一個字段,n爲2表示第二個字段。 $0 這個變量包含執行過程當中當前行的文本內容。 [N] ARGC 命令行參數的數目。 [G] ARGIND 命令行中當前文件的位置(從0開始算)。 [N] ARGV 包含命令行參數的數組。 [G] CONVFMT 數字轉換格式(默認值爲%.6g)。 [P] ENVIRON 環境變量關聯數組。 [N] ERRNO 最後一個系統錯誤的描述。 [G] FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。 [A] FILENAME 當前輸入文件的名。 [P] FNR 同NR,但相對於當前文件。 [A] FS 字段分隔符(默認是任何空格)。 [G] IGNORECASE 若是爲真,則進行忽略大小寫的匹配。 [A] NF 表示字段數,在執行過程當中對應於當前的字段數。 [A] NR 表示記錄數,在執行過程當中對應於當前的行號。 [A] OFMT 數字的輸出格式(默認值是%.6g)。 [A] OFS 輸出字段分隔符(默認值是一個空格)。 [A] ORS 輸出記錄分隔符(默認值是一個換行符)。 [A] RS 記錄分隔符(默認是一個換行符)。 [N] RSTART 由match函數所匹配的字符串的第一個位置。 [N] RLENGTH 由match函數所匹配的字符串的長度。 [N] SUBSEP 數組下標分隔符(默認值是34)。
一、打印文件的第一列(域): awk '{print $1}' filename 二、打印文件的前兩列(域): awk '{print $1,$2}' filename 三、打印完第一列,而後打印第二列: awk '{print $1 $2}' filename 四、打印文本文件的總行數: awk 'END{print NR}' filename 五、打印文本第一行: awk 'NR==1{print}' filename 六、打印文本第二行第一列: sed -n "2, 1p" filename | awk 'print $1' 七、打印文件的最後一行 awk 'END{print}' 或 tail -1 file
shell裏面的賦值方法有兩種,格式爲
1) arg=`(命令)` 2) arg=$(命令) 所以,若是想要把某一文件的總行數賦值給變量nlines,能夠表達爲: 1) nlines=`(awk 'END{print NR}' filename)` 或者 2) nlines=$(awk 'END{print NR}' filename)