欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

精通awk系列(14):细说awk中的变量和变量赋值

程序员文章站 2022-06-04 18:38:32
回到: "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中声明变量的位置

  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代码段中都能直接使用。

精通awk系列(14):细说awk中的变量和变量赋值

3.直接在awk代码部分暴露shell变量,交给shell解析进行shell的变量替换

num=$(cat a.txt | wc -l)
awk 'begin{print '"$num"'}'

这种方式最灵活,但可读性最差,可能会出现大量的引号。