700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > linux脚本awk 如何在awk脚本中使用shell变量?

linux脚本awk 如何在awk脚本中使用shell变量?

时间:2024-04-07 18:11:19

相关推荐

linux脚本awk 如何在awk脚本中使用shell变量?

获取shell变量awk

可以通过几种方式完成。有些人比其他人好。这应该涵盖大部分内容。如果您有评论,请在下面留言。

使用-v(最好的方式,最便携)

使用-v选项:( PS后使用空格-v或不太便携。例如,awk -v var=不是awk -vvar=)variable="lineone\nlinetwo"awk-vvar="$variable"'BEGIN{printvar}'lineone

linetwo

这应该与大多数兼容awk,并且变量在BEGIN块中也可用:

如果您有多个变量:awk-va="$var1"-vb="$var2"'BEGIN{printa,b}'

警告。正如Ed Morton写的那样,转义序列将被解释\t为真实tab而不是\t你所搜索的。可以通过使用ENVIRON[]或访问来解决ARGV[]

代码块后变量

这里我们得到awk代码后面的变量。只要您不需要BEGIN块中的变量,这将正常工作:variable="lineone\nlinetwo"echo"inputdata"|awk'{printvar}'var="${variable}"or

awk'{printvar}'var="${variable}"file

这也适用于多个变量awk '{print a,b,$0}' a="$var1" b="$var2" file

以这种方式使用变量在BEGIN块中不起作用:echo"inputdata"|awk'BEGIN{printvar}'var="${variable}"

这里串

变量也可以添加到awk使用支持它们的shell中的here-string(包括Bash):awk'{print$0}'<<

这与:printf'%s'"$variable"|awk'{print$0}'

PS这会将变量视为文件输入。

ENVIRON输入

正如TrueY所写,您可以使用它ENVIRON来打印环境变量。在运行AWK之前设置变量,可以像这样打印出来:X=MyVarawk'BEGIN{printENVIRON["X"],ENVIRON["SHELL"]}'MyVar/bin/bash

ARGV输入

正如Steven Penny所写,您可以使用ARGV将数据导入awk:v="mydata"awk'BEGIN{printARGV[1]}'"$v"mydata

要将数据放入代码本身,而不仅仅是BEGIN:v="mydata"echo"test"|awk'BEGIN{var=ARGV[1];ARGV[1]=""}{printvar,$0}'"$v"mydatatest

代码中的变量:小心使用

您可以在awk代码中使用变量,但它很麻烦且难以阅读,并Charles Duffy指出,此版本也可能是代码注入的受害者。如果有人向变量添加了不好的东西,它将作为awk代码的一部分执行。

这通过在代码中提取变量来工作,因此它成为它的一部分。

如果你想awk使用变量动态地改变它,你可以这样做,但不要将它用于普通变量。variable="lineone\nlinetwo"awk'BEGIN{print"'"$variable"'"}'lineone

linetwo

以下是代码注入的示例:variable='lineone\nlinetwo";for(i=1;i<=1000;++i)printi"'awk'BEGIN{print"'"$variable"'"}'lineone

linetwo123..1000

您可以通过awk这种方式添加许多命令。甚至使用无效命令使其崩溃。

额外信息:

使用双引号

双引号变量总是好的。"$variable"

如果不是,多行会被添加为一条长单行。

例:var="Lineone

Thisislinetwo"echo$varLineoneThisislinetwo

echo"$var"LineoneThisislinetwo

没有双引号你可以得到的其他错误:variable="lineone\nlinetwo"awk-vvar=$variable'BEGIN{printvar}'awk:cmd.line:1:one\nline

awk:cmd.line:1:^backslashnotlastcharacteronline

awk:cmd.line:1:one\nline

awk:cmd.line:1:^syntaxerror

并且使用单引号,它不会扩展变量的值:awk-vvar='$variable''BEGIN{printvar}'$variable

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。