2009-03-05

awk与shell互相传送变量的方法

awk向shell传变量比较简单,主要是用shell的eval和awk的print迂回地实现


$ eval $(awk 'BEGIN{ print "str=\"for not\""; print "str2=hello" }' )

$ echo $str
for not

$ echo $str2
hello



shell向awk传递变量的方法则比较多,有四种: 1. -v选项; 2. 修改ARGV; 3. shell的导出变量; 4. 将命令写在两对单引号里
1. -v选项

$ awk 'BEGIN{ print var; }' -v var=fornote

$ awk -v var=hello 'BEGIN{ print var; }'
hello

这种方法有两点要注意. 一是-v选项要写在awk的BEGIN块前面,不然在BEGIN块里就不能使用了;有的版本的awk要求-v后面要有一个空格.所以为了代码的可移植性,-v应该要带上空格.

2. 修改ARGV

$ echo $str2
hello

$ awk 'BEGIN{ var=ARGV[1]; ARGV[1]=""; print var; print ARGV[2] }' "$str2" sed.test
hello
sed.test

$ awk 'BEGIN{ print var; print ARGV[2] }' var="$str2" sed.test

sed.test

$
awk '{print var;print ARGV[1];print ARGV[2]}'var="$str2" sed.test
hello
var=hello
sed.test
hello
var=hello
sed.test
hello
var=hello
sed.test

$ cat sed.test
sed\ntest\nsed
sedtestsed
test\nsed

注意:1.上面的例1和例2都修改了ARGV这个数组,如果在后面要用到这个数组则一定记住这一点;2. 上面的例二的ARGV[1]因为有一个等号,所以awk没有把它当作待处理的文件,在BEGIN块中是访问不到这样设置的变量的;所以,如果要向awk传递文件名里有"="的文件,则要作特殊处理(给文件名加上路径或用输入重定向到awk)

3.shell导出的变量
这里其实是用到了awk的ENVIRON这个内置的数组

$ str="for note"

$ export str

$ awk 'BEGIN{ print ENVIRON["str"]; }'
for note



4.将命令写在两对单引号里
$ awk 'BEGIN{ print "'"$string"'" }'
for note

上面的例子中,红色和蓝色的引号各成一对,这样其实string就包含在一对双引号里,所以会被shell扩展成它的值.


转载请注明出处 http://fornote.blogspot.com/

没有评论:

发表评论