awk 与 Shell 之间的变量传递 — awk 调用 Shell 变量并传递给 Shell
本文最后更新于 2019-04-04【1519 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!
在写 Shell 脚本时,尤其是涉及到数据、文本处理时,经常会使用到 awk 程序。在有些复杂的逻辑,可能会涉及 awk 和 Shell 之间的变量传递,即在 awk 中使用在 Shell 中定义的变量,有时还需要在 Shell 中继续处理 awk 程序处理之后产生的变量。
awk 调用 Shell 变量
awk 调用 Shell 中定义的变量方法有很多,介绍如下:
使用 "'
这种方式是使用 "' 将 Shell 中的变量包起来,即 "'$var'";注意:这里是 双引号+单引号+shell变量+单引号+双引号
的格式。这种写法无需改变用单引号 '
把 awk 程序括起来的习惯,这种写法其实际是双括号变为单括号的常量,传递给了 awk.
例:
shell_var="abc"
awk 'BEGIN{printf "'$shell_var'"}'
使用 "'"
和之前的方法类似,但使用 "'" 将 Shell 中的变量包起来即"'"$var"'";注意是 双引号+单引号+双引号+shell变量+双引号+单引号+双引号
的格式。如果变量的值中包含空格,为了 shell 不把空格作为分隔符,则应使用此方法。
例:
shell_var="this a test"
awk 'BEGIN{printf "'"$shell_var"'"}'
使用 export 与 ENVIRON
首先 export
变量,然后在 awk 中使用 ENVIRON["var"]
形式获取环境变量的值
例:
shell_var="this a test";
export shell_var;
awk 'BEGIN{print ENVIRON["shell_var"]}'
使用 awk -v 选项
每调用一次变量都要加一个 -v 参数,后面使用 shell 变量的时候,就不用加 $ 了。当变量不是很多时,建议使用这种方式。
例:
shell_var="this a test"
awk -v awk_var="$shell_var" 'BEGIN{print awk_var}'
awk 调用 Shell 脚本
如果在 awk 命令中需要调用 Shell 脚本/命令,则需要使用 system()
函数,如果需要将 awk 变量传递给被调用的 Shell,则写为 system("shell_script.sh" $var)
例:
## data.txt:
## . ..
awk '{system("ls " $1)}' data.txt
Shell 中调用 awk 变量
在 Shell 中调用 awk 变量,即由 awk 向 Shell 传递变量,其思想是用 awk 输出若干条 Shell 命令,然后再用 Shell 去执行,通常是用 eval
.
例:
#!/bin/bash
var1="1"
var2="2"
eval $(awk 'BEGIN{print "var1=2;var2=1"}')
echo "var1:"$var1 ## 输出 var1:2
echo "var2:"$var2 ## 输出 var2:1
例2:
eval $(awk '{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}' abc.txt)
经上述操作后,可在 Shell 中直接使用变量 var1,var2...
参考网络上的众多文章,其中 "awk 调用 Shell 变量"部分已经在实际工作中使用,其余部分经测试后发布
本文作者:Quanyin Tang
本文链接:awk 与 Shell 之间的变量传递 — awk 调用 Shell 变量并传递给 Shell - https://www.imtqy.com/awk-shell-var.html
版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
牛逼
优秀,我刚刚谷歌搜索引擎给爆破了,谢谢你提供的技术教程。
优秀,我刚刚把www.gov.cn爆破了,谢谢你提供的技术教程。
牛逼!gov.cn 都能都敢爆破!