在awk中取消引用变量

时间:2013-05-10 04:29:18

标签: variables awk dereference

为什么这不起作用?

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

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

4 个答案:

答案 0 :(得分:3)

将shell变量的值传递给awk的唯一方法如下

$ x=5

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

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

这两种方法的主要区别在于,通过使用-vx块中设置BEGIN的值,而第二种方法则不设置值。所有其他引用技巧或逃避的方法都不应该,除非你喜欢头痛。


但是你想要解析ls,你真正想要的命令是:

stat --printf="%s\n" *

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

答案 1 :(得分:2)

您可以访问类似于这些的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"]}'

答案 2 :(得分:1)

这是一个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}"

答案 3 :(得分:0)

试试这个:

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