回到: "Linux系列文章" "Shell系列文章" "Awk系列文章" awk變數 awk的變數是動態變數,在使用時聲明。 所以awk變數有3種狀態: 未聲明狀態:稱為untyped類型 引用過但未賦值狀態:unassigned類型 已賦值狀態 引用未賦值的變數,其預設初始值為空字元串或數值0 ...
回到:
awk變數
awk的變數是動態變數,在使用時聲明。
所以awk變數有3種狀態:
- 未聲明狀態:稱為untyped類型
- 引用過但未賦值狀態:unassigned類型
- 已賦值狀態
引用未賦值的變數,其預設初始值為空字元串或數值0。
在awk中未聲明的變數稱為untyped,聲明瞭但未賦值(只要引用了就聲明瞭)的變數其類型為unassigned。
gawk 4.2版提供了typeof()
函數,可以測試變數的數據類型,包括測試變數是否聲明。
awk 'BEGIN{
print(typeof(a)) # untyped
if(b==0){print(typeof(b))} # unassigned
}'
除了typeof(),還可以使用下麵的技巧進行檢測:
awk 'BEGIN{
if(a=="" && a==0){ # 未賦值時,兩個都true
print "untyped or unassigned"
} else {
print "assigned"
}
}'
變數賦值
awk中的變數賦值語句也可以看作是一個有返回值的表達式。
例如,a=3
賦值完成後返回3,同時變數a也被設置為3。
基於這個特點,有兩點用法:
- 可以
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的賦值語句左右兩邊的評估順序有可能不同。
awk中聲明變數的位置
- 在BEGIN或main或END代碼段中直接引用或賦值
- 使用
-v var=val
選項,可定義多個,必須放在awk代碼的前面- 它的變數聲明早於BEGIN塊
- 普通變數:
awk -v age=123 'BEGIN{print age}'
- 使用shell變數賦值:
awk -v age=$age 'BEGIN{print age}'
- 它的變數聲明早於BEGIN塊
- 在awk代碼後面使用
var=val
參數- 它的變數聲明在BEGIN之後
awk '{print n}' n=3 a.txt n=4 b.txt
awk '{print $1}' FS=' ' a.txt FS=":" /etc/passwd
- 使用Shell變數賦值:
awk '{print age}' age=$age a.txt
- 它的變數聲明在BEGIN之後
awk中使用Shell變數
要在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"'}'
這種方式最靈活,但可讀性最差,可能會出現大量的引號。