回到:linux
awk的變量是動態變量,在使用時聲明。shell
因此awk變量有3種狀態:bash
引用未賦值的變量,其默認初始值爲空字符串或數值0。函數
在awk中未聲明的變量稱爲untyped,聲明瞭但未賦值(只要引用了就聲明瞭)的變量其類型爲unassigned。測試
gawk 4.2版提供了typeof()
函數,能夠測試變量的數據類型,包括測試變量是否聲明。code
awk 'BEGIN{ print(typeof(a)) # untyped if(b==0){print(typeof(b))} # unassigned }'
除了typeof(),還能夠使用下面的技巧進行檢測:blog
awk 'BEGIN{ if(a=="" && a==0){ # 未賦值時,兩個都true print "untyped or unassigned" } else { print "assigned" } }'
awk中的變量賦值語句也能夠看做是一個有返回值的表達式。字符串
例如,a=3
賦值完成後返回3,同時變量a也被設置爲3。get
基於這個特色,有兩點用法:工作流
x=y=z=5
,等價於z=5 y=5 x=5
x != (y = 1)
awk 'BEGIN{print (a=4);print a}'
問題:a=1;arr[a+=2] = (a=a+6)
是怎麼賦值的,對應元素結果等於?arr[3]=7
。但不要這麼作,由於不一樣awk的賦值語句左右兩邊的評估順序有可能不一樣。
-v var=val
選項,可定義多個,必須放在awk代碼的前面
awk -v age=123 'BEGIN{print age}'
awk -v age=$age 'BEGIN{print age}'
var=val
參數
awk '{print n}' n=3 a.txt n=4 b.txt
awk '{print $1}' FS=' ' a.txt FS=":" /etc/passwd
awk '{print age}' age=$age a.txt
要在awk中使用Shell變量,有三種方式:
1.在-v選項中將Shell變量賦值給awk變量
num=$(cat a.txt | wc -l) awk -v n=$num 'BEGIN{print n}'
-v選項是在awk工做流程的第一階段解析的,因此-v選項聲明的變量在BEGIN{}、END{}和main代碼段中都能直接使用。
3.直接在awk代碼部分暴露Shell變量,交給Shell解析進行Shell的變量替換
num=$(cat a.txt | wc -l) awk 'BEGIN{print '"$num"'}'
這種方式最靈活,但可讀性最差,可能會出現大量的引號。