分享

awk正则表达式中调用ksh变量

 淡水鱼虾 2011-04-26
awk正则表达式中调用ksh变量 收藏
如果ksh中定义了变量pcname,而在嵌入ksh中的awk程序中又要使用这个环境变量,并且用它在正则表达式中,该如何用它呢?
最简单的方法就是:
view plaincopy to clipboardprint?
#!/bin/ksh  
pcname="ap201" 
nawk '/'"$pcname"'/{print $2}' $FILE 
#!/bin/ksh
pcname="ap201"
nawk '/'"$pcname"'/{print $2}' $FILE
更多方法,参见下面转载的《AWK 使用 Shell 变量》一文:
最近闲着没事,想写个Shell脚本,其中用到了 AWK。想在AWK中读取/设置Shell脚本中定义的变量,搜索些资源,总结了一些东东。
读取变量
在通过如下方式读取Shell变量
1> awk -v varName=varValue '...' ...
2> awk '...{print "'"${USER}"'"}' ...
   此种方式可以访问系统环境变量(如USER等),和自定义Shell变量。若这些变量中没有空格及其他特殊字符,则可以少写两个双引号:awk '...{print "'${USER}"}' ...
3> awk '...{print ENVIRON["USER"]}...' ...
   但是这种方法只能访问系统变量
设置变量
在AWK中尚未找到设置Shell变量的方法,因为像上面的读取的方法中,一旦awk开始执行,这些环境变量都是一个副本,无论处理多少条记录,不管主Shell中如何变化,所引用的这些变量值都保持不变。而且,通过下面的实验可以看出来,在AWK中执行system函数调用命令是另起一个Shell线程,所以无法依靠system来设置外部环境变量。
如果你的AWK只打印一条结果的话,可以使用如下方式在shell环境中设置变量
   myVar="`echo | awk '{print "AA\nBB\nCC"}'`"
注意,这种方式在awk打印多行情况下会将回车用空格替代后赋值。

实验过程如下:
$ vi tmp.sh
// 编辑内容如下
view plaincopy to clipboardprint?
#!/bin/bash  
echo  
echo "SHELL VERSION : ${SHELL} ${BASH_VERSION}" 
echo "AWK VERSION : `awk -W version | sed -n '1p'`" 
echo  
myVar="AAA BBB CCC DDD" 
echo "IN SHELL : PID=$" 
echo "IN SHELL : \${myVar}=\"${myVar}\"" 
echo  
echo | awk -v var1="${myVar}" '{  
    print "IN AWK : how to print single quote : " "'""'"'"'"   
    print "No." NR  
    print "IN AWK : -v : var1=\"" var1 "\"" 
    print "IN AWK : get : ENVIRON[\"USER\"]=\"" ENVIRON["USER"] "\"" 
    print "IN AWK : get : ENVIRON[\"myVar\"]=\"" ENVIRON["myVar"] "\"" 
    print "IN AWK : get : ${USER} =\"" "'""'"${USER}"'" "\""   
    print "IN AWK : get : ${myVar}=\"" "'""'"${myVar}"'" "\""   
    print 
    system("echo \"IN AWK : system() : PID=$\"")  
}'   
myVar="`echo | awk '{print "AA\nBB\nCC"}'`" 
#\n is replaced by space character  
echo ${myVar} 
#!/bin/bash
echo
echo "SHELL VERSION : ${SHELL} ${BASH_VERSION}"
echo "AWK VERSION : `awk -W version | sed -n '1p'`"
echo
myVar="AAA BBB CCC DDD"
echo "IN SHELL : PID=$"
echo "IN SHELL : \${myVar}=\"${myVar}\""
echo
echo | awk -v var1="${myVar}" '{
    print "IN AWK : how to print single quote : " "'"'"'"
    print "No." NR
    print "IN AWK : -v : var1=\"" var1 "\""
    print "IN AWK : get : ENVIRON[\"USER\"]=\"" ENVIRON["USER"] "\""
    print "IN AWK : get : ENVIRON[\"myVar\"]=\"" ENVIRON["myVar"] "\""
    print "IN AWK : get : ${USER} =\"" "'"${USER}"'" "\""
    print "IN AWK : get : ${myVar}=\"" "'"${myVar}"'" "\""
    print
    system("echo \"IN AWK : system() : PID=$\"")
}'
myVar="`echo | awk '{print "AA\nBB\nCC"}'`"
#\n is replaced by space character
echo ${myVar}
$ . tmp.sh
//输出结果如下
view plaincopy to clipboardprint?
SHELL VERSION : /bin/bash 3.2.25(1)-release  
AWK VERSION : GNU Awk 3.1.5 
IN SHELL : PID=10627 
IN SHELL : ${myVar}="AAA BBB CCC DDD" 
IN AWK : how to print single quote : '   
No.1 
IN AWK : -v : var1="AAA BBB CCC DDD" 
IN AWK : get : ENVIRON["USER"]="zhangll" 
IN AWK : get : ENVIRON["myVar"]=""  
IN AWK : get : ${USER} ="zhangll" 
IN AWK : get : ${myVar}="AAA BBB CCC DDD" 
IN AWK : system() : PID=17468 
AA BB CC 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bonny95/archive/2010/07/17/5742008.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多