我不知道这是否是 awk 的一个功能,但是如果我使用 awk 程序文件并使用$0
vs如果我在.$1
-f
bash 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)