awk命令結構/內置變量/獲取文本某行或某列

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)
相關文章
相關標籤/搜索