精通awk系列(14):細說awk中的變量和變量賦值


回到:linux


awk變量

awk的變量是動態變量,在使用時聲明。shell

因此awk變量有3種狀態:bash

  • 未聲明狀態:稱爲untyped類型
  • 引用過但未賦值狀態:unassigned類型
  • 已賦值狀態

引用未賦值的變量,其默認初始值爲空字符串或數值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的賦值語句左右兩邊的評估順序有可能不一樣。

awk中聲明變量的位置

  1. 在BEGIN或main或END代碼段中直接引用或賦值
  2. 使用-v var=val選項,可定義多個,必須放在awk代碼的前面
    • 它的變量聲明早於BEGIN塊
    • 普通變量:awk -v age=123 'BEGIN{print age}'
    • 使用shell變量賦值:awk -v age=$age 'BEGIN{print age}'
  3. 在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

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"'}'

這種方式最靈活,但可讀性最差,可能會出現大量的引號。

相關文章
相關標籤/搜索