您的位置:首页 > 运维架构 > Shell

awk和sed 应用shell脚本变量

2011-01-11 02:27 691 查看
最近在写一些脚本增加工作效率,当然少不了则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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: