最近在写一些脚本增加工作效率,当然少不了则awk和sed则两大法宝。在引用脚本中变量上遇到问题,上网上找到一些说明,方法很多。例如awk:

awk中使用shell的环境变量
一:"'$var'"
这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法其实际是双括号变为单括号的常量,传递给了awk.
如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'
二:'"$var"'
这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.
三.把括起awk程序的''变为"",使用"$var"
如:
$var="this is a test"
awk 'BEGIN{print "$var"}"
这是因为在""里$是特殊字符,而在''里$是普通字符.
四:export 变量,使用ENVIRON["var"]形式,
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'
五:当然也可以使用-v选项
如:
$var="this is a test"
awk -v nvar="$var" '{print nvar}'
这样便把系统变量定义成了awk变量.

多了感觉记不住。刚刚得出一个很好记的方法。均实验成功。

1.awk '{command}'  中引用变量用单引号。

king@king-desktop:~/Accaculation/script$ GW=gateway
king@king-desktop:~/Accaculation/script$ awk '/'$GW'/{print $2}'  /etc/network/interfaces
192.168.0.11
king@king-desktop:~/Accaculation/script$ awk ''/$GW/'{print $2}'  /etc/network/interfaces
192.168.0.11

king@king-desktop:~/Accaculation/script$ awk ''/$GW/','/$ADD/'{print $2}'  /etc/network/interfaces
192.168.0.11

同样sed一样可以

king@king-desktop:~/Accaculation/script$ UN=192.168.0.2

king@king-desktop:~/Accaculation/script$ sed  -n 's/192.168.0.11'/"$UN"/'p' /etc/network/interfaces
gateway 192.168.0.2

king@king-desktop:~/Accaculation/script$ sed  -n "/"$GW"/p" /etc/network/interfaces
gateway 192.168.0.11

2.awk "{command}"  中引用变量用双引号:

king@king-desktop:~/Accaculation/script$ awk ""/$ADD/","/$GW/"{print $2}"  /etc/network/interfaces
address 192.168.0.71
netmask 255.255.255.0
gateway 192.168.0.11
这样就不行了:

king@king-desktop:~/Accaculation/script$ awk "'/$ADD/','/$GW/'{print $2}"  /etc/network/interfaces
awk: '/address/','/gateway/'{print }

awk: ^ 表达式中的无效字符“'”
-------------------------------------------------------------------

3.含有空格的字符串的变量的引用:

不适用的例子就不举了,免的越看越迷糊,好奇心重的可以去试试。

ADD="address 192"

king@king-desktop:~/Accaculation/script$ awk ''/"$ADD"/'{print $2}' /etc/network/interfaces
192.168.0.71
king@king-desktop:~/Accaculation/script$ sed -n ''/"$ADD"/'p' /etc/network/interfaces
address 192.168.0.71

都可以用。至于" "  在所引起的sed和awk命令格式的我就不举了。

1.确实不好用,对应上面的粗体看看有什么区别。

king@king-desktop:~/Accaculation/script$  awk ""/"$ADD"/"{print $2}" /etc/network/interfaces
address 192.168.0.71

2.不符合总结得出的简单规律--单引号引用的命令用单引号引用变量,含有空格的变量多加先用双引号引用。
 同样的mysql -uroot  -e " select  *  from  table  where pid="$PID" "  同样生效 。单引号的有兴趣的去试试。

本文出自 “king” 博客,请务必保留此出处http://king9527.blog.51cto.com/84461/476262

posted on 2013-05-29 11:18  aaronwxb  阅读(747)  评论(0编辑  收藏  举报