发表于
在进行文件本处理的时候,经常会遇到把外部变量传入到awk执行语句中处理输出的问题,本篇就结合一些示例说明下在shell脚本中将外部变量的值传给awk内部处理。
    一、awk基础用法
awk [ -F re] [parameter...] ['pattern {action}' ] [-f progfile][in_file...] 
[root@361way ~]# echo 'awk code' | awk 'BEGIN{print "start\n============="}{print $0}END{print "=========\nend"}'
start
=============
awk code
=========
在 awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
    二、获得外部变量方法
1、获得普通外部变量
[root@361way ~]# test='awk test code'
[root@361way ~]# echo | awk  '{print test}' test="$test"
awk test code
[root@361way ~]# echo | awk  test="$test" '{print test}'
awk: cmd. line:1: fatal: cannot open file `{print test}' for reading (No such file or directory)
注:<span style="color:#E53333;">awk '{action}' 变量名=变量值</span>,这样传入变量,可以在action中获得值。 注意:变量名与值放到'{action}'后面。
还需要注意的是上面这种写法,在BEGIN中的action不能获取外部变量,如下面的例子:
[root@361way ~]# echo | awk  'BEGIN{print test}' test="$test"
    2、BEGIN程序块中变量
[root@361way ~]# test='awk Begin test'
[root@361way ~]# echo | awk -v test="$test" 'BEGIN{print test}'
awk Begin test
[root@361way ~]# echo | awk -v test="$test" '{print test}'
awk Begin test
使用:<span style="color:#E53333;">awk –v 变量名=变量值 [–v 变量2=值2 …] 'BEGIN{action}'格式</span>时,用-v 传入变量可以在BEGIN、END或省略3种类型的action 中都可以获得到变量值,但顺序在action前面。而且最前面的echo管道不能少。
    3、获取环境变量
[root@361way ~]# awk  'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
PWD=/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
OLDPWD=/
AWKPATH=.:/usr/share/awk
_=/bin/awk
LANG=en_US.UTF-8
…………省略
注意:<span style="color:#E53333;">ENVIRON 是awk内置变量</span>---该部分可以参看<a href="https://www.361way.com/awk-built-in-variable/4932.html" target="_blank" rel="noopener">awk 内置变量篇</a>,可以通过上面的方法调用获取,其是一个字典数组。环境变量名 就是它的键值。输出结果和shell下的env命令输出基本类似。