在awk中解引用变量



为什么不行?

x=5
$ ls -l | awk '{print $(($x))}'

应该打印ls -l命令的字段5,对吗?

应该将shell变量的值传递给awk的唯一方法是:

$ x=5
$ ls -l | awk -v x="$x" '{print $x}'
$ ls -l | awk '{print $x}' x="$x"

这两种方法的主要区别在于,使用-v时,x的值在BEGIN块中设置,而第二种方法则不设置该值。除非您喜欢头痛,否则不应该使用所有其他带有引用技巧或转义的方法。


无论你不想解析ls,你真正想要的命令是:

stat --printf="%sn" *

假设ls的第五列与我的相同,这将显示当前目录中的所有文件大小。

您可以访问类似于这些的shell变量;

不建议使用第一种方法!

x=5
ls -l | awk '{print $'$x'}'

或者在程序开始执行之前将值x赋值给变量shellVar

x=5
ls -l | awk -v shellVar="$x" '{print $shellVar}'

或使用包含当前环境

值的数组
export x=5
ls -l | awk '{print $ENVIRON["x"]}'

这是一个shell变量,不被shell用单引号展开。我们将awk脚本放在单引号中的原因正是为了防止shell解释对awk有利的内容而把事情搞砸,但有时您希望shell解释部分内容。

对于这样的内容,我更喜欢将值作为awk变量传入:

ls -l | awk -v "x=$x" '{print $x}'

但是你可以用很多其他的方法。例如:

ls -l | awk '{print $'$x'}'

实际上应该是这样的:

ls -l | awk '{print $'"$x"'}'

或者:

ls -l | awk "{print $$x}"

试试这个:

ls -l | awk '{print $'$x'}'

相关内容

  • 没有找到相关文章

最新更新