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

  • 2019 年 10 月 4 日
  • 筆記

awk腳本基本結構

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 }語句塊,它逐行掃描文件,從第一行到最後一行重複這個過程,直到文件全部被讀取完畢。

第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。

BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。

END語句塊在awk從輸入流中讀取完所有的行之後即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。

pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,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)。
1、打印文件的第一列(域):  awk '{print $1}' filename  2、打印文件的前兩列(域):  awk '{print $1,$2}' filename  3、打印完第一列,然後打印第二列:  awk '{print $1 $2}' filename  4、打印文本文件的總行數:  awk 'END{print NR}' filename  5、打印文本第一行:  awk 'NR==1{print}' filename  6、打印文本第二行第一列:  sed -n "2, 1p" filename | awk 'print $1'  7、打印文件的最後一行  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)