Linux 奇怪的awk行为,$1已打印,但$0未打印?

Linux 奇怪的awk行为,$1已打印,但$0未打印?,linux,bash,ubuntu,awk,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: ls | xargs -I var sh -c 'echo var | awk "{print $0}"' 在双引号中包含

这是精细打印的
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

ls | xargs -I var sh -c 'echo var | awk "{print $0}"'
在双引号中包含
$0
,因此
$0
由shell展开,在本例中,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
输出很容易出错。

对于在此处登录的其他人:如果您的语法很完美,但您可能正在使用windows文件,请记住
\r
将有效覆盖您的文本,并使其看起来像
$0
是空白的

首先运行
dos2unix
,然后尝试您的
awk


注意:用
sed
tr
删除
\r
是不够的

首先不要这样使用
ls
。您有一个XY问题,您假设从
ls
的输出读取数据是完成某项任务的正确方法。当然,这只是为了重现问题。在我的例子中,我使用的是
find
。同样,你也不会像这样使用
find
。哦,当我读了这篇文章后,我现在明白了。我还在同一篇文章中找到了安全使用
find
的解决方案。谢谢