awk -v 变量赋值

awk -v 变量赋值

*nix / awk 新手在这里。我想知道下面的简单 awk -v 示例的语法有什么问题。

# this line produces the expected result, 'xyz'
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'

# but this line does not, it prints a blank line
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'

我对上面的 -v 选项做错了什么?

预先感谢您的帮助。

答案1

让我们看看你的第一个例子:

echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'

这会将awk变量设置为第二个 shell 脚本参数¹。awk然后代码会忽略该变量,并在其标准输入, IE。xyz为唯一的线路。请注意,如果您打印,ttl您会发现它是空的。

基本上,第一个$2是 shell 参数扩展,由 shell 执行,第二个是一个awk字段($应用于数字 2 的运算符,您也可以写它$ 2$ (1 + 1)...),对每一行进行计算标准输入经过awk

现在让我们考虑第二个例子:

echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'

这会将awk变量设置为第二个 shell 脚本参数 1。然后,代码awk为每一行打印该变量,该变量为空标准输入

在 shell 上下文中,$2是 shell 脚本的第二个参数。当您直接从命令行运行它时,没有“第二个参数”²,因此它是空的。但是,当您将其作为脚本运行时,它可能具有值。

#!/bin/sh -
printf 'This is $2: %s\n' "$2"

将其保存在文件中demo,使其可执行chmod a+x demo。现在运行它并观察:

./demo one
./demo one two
./demo one two three

不幸的是,您没有告诉我们您想要实现什么目标,所以我无法针对您的要求提出解决方案。但希望您能了解这些答案中的信息。

如果您想ttl指定要输出的字段,您可以使用:

$ echo "abc xyz" | awk -v ttl=2 '{print $ ttl}'
xyz

1 但请注意,使用语法时,值中的-v var=value转义序列(例如\n, ... )会由 awk 扩展,因此如果 contains ,将包含换行符而不是\v$2\nttl\n

set one two three² 除非您事先或可能2=two或在某些 shell 中运行过,argv=(one two three)这是在 shell 中动态更改位置参数的方法。

答案2

在第二种情况下$2没有价值。在脚本$2中有价值awk。如果你设置类似:

AAA="test123"
echo "abc xyz" | /usr/bin/awk -v ttl="$AAA" '{print ttl}'

AAA它将打印从 shell 环境中获取的变量值。

如果您明确想要在特定变量中使用,awk可以按以下方式进行:

echo "abc xyz" | /usr/bin/awk  '{ttl=$2;print ttl}'

相关内容