本文最后更新于 2019-04-04【1810 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!

在写 Shell 脚本时,尤其是涉及到数据、文本处理时,经常会使用到 awk 程序。在有些复杂的逻辑,可能会涉及 awk 和 Shell 之间的变量传递,即在 awk 中使用在 Shell 中定义的变量,有时还需要在 Shell 中继续处理 awk 程序处理之后产生的变量。

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 变量"部分已经在实际工作中使用,其余部分经测试后发布
文章目录
文章目录


推荐使用:阿里云 云翼计划学生优惠、ECS、轻量应用等产品与服务【 点击注册

本文作者:Quanyin Tang

本文链接:awk 与 Shell 之间的变量传递 — awk 调用 Shell 变量并传递给 Shell - https://www.imtqy.com/awk-shell-var.html

版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!