如何将bash变量作为awk参数的值传递?

如何将bash变量作为awk参数的值传递?,bash,scripting,awk,Bash,Scripting,Awk,我想用bash变量替换awk命令中的变量 例如: var="one two three" echo $var | awk "{print $2}" 我想用var变量替换$2。我尝试了awk-v以及类似于awk“{print${$wordnum}}的东西,但都没有用。你几乎成功了 $ myfield='$3' $ echo $var | awk "{print $myfield}" three 第一行的硬引号阻止了shell对$3的解释。第二行的软引号允许变量替换。明显不同的方法: $

我想用bash变量替换awk命令中的变量

例如:

var="one two three"    
echo $var | awk "{print $2}"

我想用
var
变量替换
$2
。我尝试了
awk-v
以及类似于
awk“{print${$wordnum}}
的东西,但都没有用。

你几乎成功了

$ myfield='$3'
$ echo $var | awk "{print $myfield}"
three

第一行的硬引号阻止了shell对
$3
的解释。第二行的软引号允许变量替换。

明显不同的方法:

$ echo $var
one two three

$ field=3

$ echo $var | awk -v f="$field" '{print $f}'
three

$ field=2

$ echo $var | awk -v f="$field" '{print $f}'
two

您可以将部分awk语句与变量连接起来。这可能是您希望在脚本文件中使用的内容:

echo$1 | awk'{print($'$2');}'

在这里,
{print($
和局部变量$2和
);}
的部分被连接起来并提供给awk


编辑:在得到一些建议后,不要使用此选项。可能是一次性解决方案。最好立即习惯使用此选项-请参阅第一条评论中的链接。

这很有意义!我需要传递$2,而不是$2的值。谢谢。但我需要从shell传递变量。例如,silo.sh something 5,以便$1=something和$2=5,因此传递$5以打印awk命令中的第5项。不要这样做,因为当您的shell变量包含一些字符时,会导致奇怪的错误。有关将shell变量的值传递给awk脚本的正确方法,请参阅。仅此答案的shell部分也存在其他问题。@EdMorton,有更高级的linux吗小贴士我可以从中学到更多的东西,他们就像你可以问问题和得到答案一样,但所有的壳牌和awk专家都会在这里闲逛,所以你得到的答案会非常可靠,你可以通过浏览档案学到很多东西。我可以在这里提问。你可以使用你的电子邮件阅读器(例如雷鸟)连接到新闻服务器(例如永恒九月网)阅读/撰写新闻帖子,就像你在订阅你感兴趣的任何新闻组后发电子邮件一样。Google groups还有一个到netnews的半成品界面,还有webnews.net,都可以从浏览器访问。不要这样做,因为当你的shell变量包含一些字符时,会导致奇怪的错误。请参阅cfajohnson.com/shell/cus-faq-2.html#Q24以获取将shell变量的值传递给awk脚本的正确方法。仅此答案的shell部分也存在其他问题。@EdMorton:您能给出两个问题的示例吗?如果我控制输入,是否仍然有理由不使用串联语句?请尝试使用$1和/或$2等于*或$2的语句填充或设置为非数值或…不使用连接语句的最佳原因可能是没有理由使用连接语句,如果您总是正确地使用连接语句,那么在您没有像您所想的那样控制输入时,您不会因为错误地使用连接语句而绊倒自己。同上r引用您的shell变量。+1表示正确的方法,但双引号引用您的shell变量。@EdMorton-我故意不引用引号,因为所有操作都需要一个描述要打印哪个字段的数字。但是,是的,您是正确的。-)经验法则是“除非您有特定的理由不引用变量,否则始终引用您的变量。”“我所说的特定原因是指你想要展示的一些行为,你必须让变量不带引号才能产生。引用应该是你的默认行为,以避免意外。即使您知道使用未引用变量的危险性,并且认为它在这里是安全的,阅读本文的人可能不会,也可能认为您在这里向他们展示的内容对他们的应用程序有用,而这可能是他们的定时炸弹。