获取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