awk正则表达式中调用ksh变量
如果ksh中定义了变量pcname,而在嵌入ksh中的awk程序中又要使用这个环境变量,并且用它在正则表达式中,该如何用它呢?
最简单的方法就是:#!/bin/kshpcname="ap201"nawk'/'"$pcname"'/{print$2}'$FILE更多方法,参见下面转载的《AWK使用Shell变量》一文:最近闲着没事,想写个Shell脚本,其中用到了AWK。想在AWK中读取/设置Shell脚本中定义的变量,搜索些资源,总结了一些东东。
读取变量
在通过如下方式读取Shell变量
1>awk-vvarName=varValue'...'...
2>awk'...{print"'"${USER}"'"}'...
此种方式可以访问系统环境变量(如USER等),和自定义Shell变量。若这些变量中没有空格及其他特殊字符,则可以少写两个双引号:awk'...{print"'${USER}"}'...
3>awk'...{printENVIRON["USER"]}...'...
但是这种方法只能访问系统变量
设置变量
在AWK中尚未找到设置Shell变量的方法,因为像上面的读取的方法中,一旦awk开始执行,这些环境变量都是一个副本,无论处理多少条记录,不管主Shell中如何变化,所引用的这些变量值都保持不变。而且,通过下面的实验可以看出来,在AWK中执行system函数调用命令是另起一个Shell线程,所以无法依靠system来设置外部环境变量。
如果你的AWK只打印一条结果的话,可以使用如下方式在shell环境中设置变量
myVar="`echo|awk'{print"AA\nBB\nCC"}'`"
注意,这种方式在awk打印多行情况下会将回车用空格替代后赋值。
实验过程如下:
$vitmp.sh
//编辑内容如下
#!/bin/bashechoecho"SHELLVERSION:${SHELL}${BASH_VERSION}"echo"AWKVERSION:`awk-Wversion|sed-n'1p'`"echomyVar="AAABBBCCCDDD"echo"INSHELL:PID=$"echo"INSHELL:\${myVar}=\"${myVar}\""echoecho|awk-vvar1="${myVar}"'{print"INAWK:howtoprintsinglequote:""'"'"'"print"No."NRprint"INAWK:-v:var1=\""var1"\""print"INAWK:get:ENVIRON[\"USER\"]=\""ENVIRON["USER"]"\""print"INAWK:get:ENVIRON[\"myVar\"]=\""ENVIRON["myVar"]"\""print"INAWK:get:${USER}=\"""'"${USER}"'""\""print"INAWK:get:${myVar}=\"""'"${myVar}"'""\""printsystem("echo\"INAWK:system():PID=$\"")}'myVar="`echo|awk'{print"AA\nBB\nCC"}'`"#\nisreplacedbyspacecharacterecho${myVar}
$.tmp.sh
//输出结果如下
SHELLVERSION:/bin/bash3.2.25(1)-releaseAWKVERSION:GNUAwk3.1.5INSHELL:PID=10627INSHELL:${myVar}="AAABBBCCCDDD"INAWK:howtoprintsinglequote:'No.1INAWK:-v:var1="AAABBBCCCDDD"INAWK:get:ENVIRON["USER"]="zhangll"INAWK:get:ENVIRON["myVar"]=""INAWK:get:${USER}="zhangll"INAWK:get:${myVar}="AAABBBCCCDDD"INAWK:system():PID=17468AABBCC