从文件运行与从 bash 运行时 awk $0 和 $1 的行为不同

从文件运行与从 bash 运行时 awk $0 和 $1 的行为不同

我不知道这是否是 awk 的一个功能,但是如果我使用 awk 程序文件并使用$0vs如果我在.$1-fbash command line

获取以下测试文件:

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

当我在 bash 命令行上使用以下命令时:

awk "{ print $1 }" sample_input.txt

我得到以下输出:

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

正如您所看到的,这是 $0 而不是 $1 的输出。 $0 只输出空行。

现在,当我在 awk 命令中使用相同的命令时,我得到了正确的输出:

{ print $1 }
awk -f test.awk sample_input.txt

a
a
a
a
a
a,bc,

我使用的是 Ubuntu 18.04。这是 的一些奇怪的功能吗awk

答案1

这并不是什么奇怪的功能,awk而是由于 shell 处理双引号中的变量的常规方式所致。

在命令中

awk "{ print $1 }" sample_input.txt

awk由于代码是双引号的,shell 会替换$1为第一个位置参数的值(通常是给脚本或 shell 函数的第一个命令行参数)。如果该值为空或未设置,您的awk脚本将变为

awk "{ print }" sample_input.txt

其效果与

cat sample_input.txt

为了防止 shell 扩展$1,请单引号该awk脚本:

awk '{ print $1 }' sample_input.txt

POSIX 标准描述了 shell 对于双引号和单引号的行为:

将字符括在单引号 ( '') 中应保留单引号内每个字符的字面值。单引号内不能出现单引号。

用双引号 ( "") 括起来的字符应保留双引号内所有字符的字面值,但字符反引号、<dollar-sign>、 和除外<backslash>,如下所示:

$

引入参数扩展后应<dollar-sign>保留其特殊含义(请参阅参数扩展)、命令替换的一种形式(请参阅命令替换)和算术扩展(请参阅算术扩展)。

[...]

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02

相关内容