回到: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"'}'
这种方式最灵活,但可读性最差,可能会出现大量的引号。