zoukankan      html  css  js  c++  java
  • (11)细说awk中的变量和变量赋值

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

    在非选项型参数位置处使用var=value格式将shell变量赋值给awk变量。
    [root@docker-01 ~]# num=$(cat a.txt |wc -l)
    [root@docker-01 ~]# awk '{print n}' n=$num a.txt
    11
    11
    11
    11
    11
    11
    11
    11
    11
    11
    11
    非选项型参数设置的变量不能在BEGIN代码段中使用。

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

    [root@docker-01 ~]# num=$(cat a.txt | wc -l)
    [root@docker-01 ~]# awk 'BEGIN{print '"$num"'}'
    11

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

  • 相关阅读:
    scala学习笔记4:函数和闭包
    架构模式: 领域事件
    架构模式:API组合
    架构模式: Saga
    架构模式: 客户端 UI 构建
    架构模式: 服务器端页面碎片化元素构建
    架构模式: 记录部署和变更日志
    架构模式: 健康检查API
    架构模式: 异常追踪
    架构模式:分布式跟踪
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12396062.html
Copyright © 2011-2022 走看看