题目
[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
感谢南宁@黑哥的指导