Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518518
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类:

2009-03-27 14:42:20

最近闲着没事,想写个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
// 编辑内容如下

#!/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
//输出结果如下


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

阅读(892) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~