奇怪的awk行为,打印$ 1但$ 0不是?

时间:2017-05-19 14:25:32

标签: linux bash ubuntu awk

打印正常ls | xargs -I var sh -c 'echo var | awk "{print $1}"'

虽然这不是ls | xargs -I var sh -c 'echo var | awk "{print $0}"'

显然这不是我的用例,只是为了重现问题。

因此,虽然$ 0代表完整的行,但是当打印$ 1时不打印$ 0是奇怪的。

参考操作系统 - Ubuntu 14.04

2 个答案:

答案 0 :(得分:5)

使用时:

ls | xargs -I var sh -c 'echo var | awk "{print $0}"'

双引号中有$0因此$0会被shell扩展,在这种情况下,它的值为sh,不带引号。 awk将其视为变量并打印为空白。

要使其工作,请转义$

ls | xargs -I var sh -c 'echo var | awk "{print \$0}"'

为什么$1有效:

ls | xargs -I var sh -c 'echo var | awk "{print $1}"'

$1也被shell扩展,它是空的。因此awk只执行一个空的print,它相当于print $0,并且您在输出中获得了文件名。

然而,在双引号中使用awk命令并解析ls输出容易出错并不是一个好主意。

答案 1 :(得分:0)

对于其他登陆此处的用户:如果语法完美,但是您可能正在使用Windows文件,请记住\r将有效地覆盖您的文本,并使$0看起来空白。...< / p>

首先运行dos2unix <file>,然后尝试运行awk

注意:仅用\rsed删除tr