免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8537 | 回复: 14
打印 上一主题 下一主题

自己理解的awk对引号及变量的处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 20:42 |只看该作者 |倒序浏览
今天搜了很多帖子看了关于awk中使用引用,以及外部变量的讨论
后来自己用bash -x 的方式摸索了一下,把一些心得写在下面,
有些地方是我自己认为的,如果不对请大家纠正~~

先说简单的情况,假设shell中有一个变量a="hello"
可以这么来处理
$ awk 'BEGIN{print "'$a'"}'         
这样做以后,经过shell处理,就变成了
$ awk 'BEGIN{print "'___$a___'"}'       ___为区分而写上,实际上不存在
也就是说,awk的参数部分分成了三段,而$a在shell中会被替换成hello
所以最终处理后的结果就变成了
$ awk 'BEGIN{print "hello"}'      

现在再说情况复杂一点的情况,a="hello world"
如果还像上面那样做,
$ awk 'BEGIN{print "'___$a___'"}'
就会替换成  
$ awk 'BEGIN{print "hello' 'world"}'
(也就是说,shell在把$a替换成hello wolrd的时候(注意这里的$a没有引号),
由于此时空格已非shell meta了,为了表示它只是一个普通的空格符
shell就给它加上了' ')

上面的解释错了,修改如下:
shell在把$a替换成hello wolrd的时候,由于$a没有引号,
空格就被shell当成IFS解释了(也就是说,跟awk后面那个
空格在表示的意思上是完成一样的,都是shell meta)
这样这条awk命令其实就是由
awk
BEGIN{print "hello
world"}
这三部分组成
难怪awk报错了
      
这样,awk在解析的时候就变成了
$ awk 'BEGIN{print "hello'___空格___'world"}'
这么三段,那个原本应该是要被转义的空格
因为前面的'匹配错误的关系导致它变成了shell meta,使得awk没办法处理

所以也就不是匹配出错的问题啦^ ^

按照上面的解释,就可以这么来修改,比如
$ awk 'BEGIN{print "'"$a"'"}'        
或者
$ awk "BEGIN{print \"$a\"}"
或者
$ awk BEGIN\{print\""$a"\"\}

PS:今天又仔细看了下十三问,发现上面讨论的其实就是很基本的
    $a 跟 "$a"的问题
    只不过放在awk里面搞复杂了~~

[ 本帖最后由 jjj346 于 2009-3-2 16:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-27 21:45 |只看该作者
楼主测试的很详细

[ 本帖最后由 ywlscpl 于 2009-2-27 21:46 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-02-27 22:00 |只看该作者
从楼主这学习了,看来以后再awk中引用shell变量还是多加一层双引号来的保险
以后就用楼主这个了,awk 'BEGIN{print "'"$a"'"}'   
"'"$a"'"共3层,最外面双引号,中间单引号,最里面双引号

论坛徽章:
0
4 [报告]
发表于 2009-02-27 22:39 |只看该作者
原帖由 ywlscpl 于 2009-2-27 22:00 发表
从楼主这学习了,看来以后再awk中引用shell变量还是多加一层双引号来的保险
以后就用楼主这个了,awk 'BEGIN{print "'"$a"'"}'   
"'"$a"'"共3层,最外面双引号,中间单引号,最里面双引号

这就是学习,嘿嘿!!!

论坛徽章:
0
5 [报告]
发表于 2009-02-27 23:11 |只看该作者
刚测试了下,收益非浅!!再次感谢!

论坛徽章:
0
6 [报告]
发表于 2009-02-27 23:41 |只看该作者

回复 #1 jjj346 的帖子

呵呵,未来的SHELL版版主

论坛徽章:
0
7 [报告]
发表于 2009-02-27 23:53 |只看该作者
多谢大家支持
我对shell编程接触不久,在CU上学了很多东西
发现自己的问题很多大家都问过了,以后还得常来

论坛徽章:
0
8 [报告]
发表于 2009-02-27 23:56 |只看该作者

回复 #7 jjj346 的帖子

问之前可以搜一下,很多问题都是重复的

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2009-02-27 23:56 |只看该作者

回复 #1 jjj346 的帖子

我觉得LZ理解错了,把bash对引用的解析弄错了。

论坛徽章:
0
10 [报告]
发表于 2009-02-28 00:04 |只看该作者
我得再翻翻十三问去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP