为什么这不起作用?
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="%s\n" *
假设您的第五列与我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'}'