2

为什么这不起作用?

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

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

4

4 回答 4

3

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

$ x=5

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

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

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


但是你根本不想被解析ls,你真正想要的命令是:

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

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

于 2013-05-10T07:35:11.630 回答
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"]}'
于 2013-05-10T04:53:21.150 回答
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}"
于 2013-05-10T05:55:29.247 回答
0

尝试这个 :

ls -l | awk '{print $'$x'}'
于 2013-05-10T04:47:58.533 回答