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
的解决方案。谢谢