如何在awk脚本中使用shell变量?
我发现了一些向awk
脚本传递外部shell变量的方法,但我对'
和"
感到困惑。
首先,我试着用一个shell脚本。
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
然后尝试了awk。
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
为什么会有这样的差别?
最后我试了一下这个。
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
我对此感到困惑。
258
3
使用
-v
(最好的方法,最容易携带)使用
-v
选项:(P.S. 在-v
后面加一个空格,否则会降低便携性。例如,awk -v var=
而不是awk -vvar=
)这应该与大多数 "awk "兼容,而且变量在 "BEGIN "块中也是可用的。
如果你有多个变量。
警告。 正如Ed Morton所写的,转义序列会被解释,所以
t
变成了真正的tab
,而不是t
,如果这是你搜索的内容。可以通过使用ENVIRON[]
解决,或者通过ARGV[]
访问。*PS 如果你喜欢用三个竖条作为分隔符
|||
,它不能被转义,所以使用-F"[|][|][|]"
。代码块后的变量
这里我们在 "awk "代码后得到变量。只要你在 "BEGIN "块中不需要这个变量,这就可以正常工作。
这也适用于多个变量
awk '{print a,b,$0}' a="$var1" b="$var2" file
。这样使用变量在
BEGIN
块中不起作用。Here-string
也可以使用支持[here-string][1]的shell(包括Bash)向
awk
添加变量。根据你希望如何处理shell变量中的反斜线,使用其中之一(
avar
是一个awk变量,svar
是一个shell变量)。详情和其他选项见http://cfajohnson.com/shell/cus-faq-2.html#Q24。上面的第一种方法几乎是你最好的选择,而且有最明显的语义。
你可以在命令行选项
-v
中传递一个变量名(v
)和一个环境变量的值(=
)("${v}"
)。或者说得更清楚一些(用更少的 "v")。