awk内引用shell变量【自己手动加精】

题目

[root@localhost ~]# cat 1.txt
iii
sss
ddd

  

执行命令

[root@localhost ~]# A=0
[root@localhost ~]# awk '{print $$A}' 1.txt
iii
sss
ddd

  

按道理应该是语法错误,正确的应该这样写

awk '{print $'$A'}' 1.txt

  

在awk中,$是有特殊含义的字符,会被解释成字段操作符

awk '{print $$A}' 相当于 awk '{print $($A)}' => awk '{print $0}'

================================================================
为了跟清楚的解释,新建urfile,这样就能看出区别了

[root@localhost ~]# cat urfile
iii 1
sss
ddd
[root@localhost ~]# awk '{print $$A}' urfile
iii 1
sss
ddd
[root@localhost ~]# cat urfile
1 iii
sss
ddd
[root@localhost ~]# awk '{print $$A}' urfile
1
sss
ddd

  

再看awk '{print $$A}' 相当于 awk '{print $($A)}'这句话,就能理解了

这里($A)解释为第A个字段,而A在awk中是未设置的变量,数值为0

[root@localhost ~]# echo | awk '{print A}'

[root@localhost ~]# echo | awk '{print A+0}'
0

  

$0在awk中表示整行,而awk又是行处理器
所以得出
$$A => $($A) => $($0) => $("1 iii")
这个结果

最后$("1 iii") => $1

[root@localhost ~]# awk '{print $"1 iii"}' urfile 
1
sss
ddd
[root@localhost ~]# awk '{print $1 iii}' urfile 
1
sss
ddd

  



在awk中,"1 iii",被分割成'1','iii'两段,
空格(space) 是 awk 的字符串连接操作符。

print $1 iii       #表示将$1跟iii连接打印出来
iii,没有引号就是当作变量名

[root@localhost ~]# awk '{print iii}' urfile 



[root@localhost ~]# awk '{print $1 12}' urfile 
112
sss12
ddd12
[root@localhost ~]# awk '{print $iii iii}' urfile 
1 iii
sss
ddd
[root@localhost ~]# awk '{print $iii "iii"}' urfile 
1 iiiiii
sssiii
dddiii
[root@localhost ~]# awk -viii=1 '{print $1 iii}' urfile 
11
sss1
ddd1
[root@localhost ~]# awk -viii=iii '{print $1 iii}' urfile 
1iii
sssiii
dddiii

  

 

连起来理解就是[print $1 iii] print$1空格(连接符)iii(awk内置变量,未设置,为空)

最后南宁@黑哥给了关于awk中变量的理解

[root@localhost ~]# echo "foo bar foobar" | awk '{A=1;print "A:"A;print "$A: "$A}'
A:1
$A: foo

  



感谢南宁@黑哥的指导

转载于:https://www.cnblogs.com/irockcode/p/6984565.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值