(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
这种方式最灵活,但可读性最差,可能会出现大量的引号。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?