免费注册 查看新帖 |

Chinaunix

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

请教个awk问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-10 15:49 |只看该作者 |倒序浏览
  1. $echo "a
  2. b"|awk '/a/'
  3. a
  4. $echo "a
  5. b"|/awk '/a/ababa'
  6. a
  7. b
  8. $echo "a
  9. b"|/awk '/a/aaa'
  10. a
  11. b
  12. $echo "a
  13. b"|awk 'aaa'
  14. $
复制代码
没明白为嘛,模式匹配后带任意字符,也不在commad里,为啥就能匹配到所有行,这是个什么用法?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2011-06-10 16:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-06-10 16:22 |只看该作者
回复 2# zooyo

  1. $ cat 1
  2. a
  3. b
  4. $ awk '/a/' 1
  5. a
  6. $ awk '/a/aaa' 1
  7. a
  8. b
复制代码
想问这里的aaa,awk是怎么解释的

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
4 [报告]
发表于 2011-06-10 16:29 |只看该作者
/a/aaa   正则的返回值 0或1后面跟一个不存在的变量,也就是空.两种情况都是真


$ awk '0""' 1
  a
  b

$ awk '1""' 1
  a
  b

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-06-11 08:57 |只看该作者
本帖最后由 yinyuemi 于 2011-06-11 09:03 编辑

个人理解:

          
awk '/a/aa' 这种形式中,会先判断/a/为1(匹配成功)或0(匹配失败),然后再和后面的aa作为一个整体,awk对其判断,此时判断的标准是字符的长度,如果等于0,不打印,如果不等于0,打印,
因为/a/无论匹配与否,都会返回一个字符1或0,所以不管后面的字符所代表的值是否为空,awk都会判断为真。
如下:
  1.           
  2. echo 'x
  3. a
  4. b
  5. e' |awk '/a/aa' # 全部输出
  6. x
  7. a
  8. b
  9. e

  10. echo 'x
  11. a
  12. b
  13. e' |awk -v aa="" '/a/aa' # 全部输出
  14. x
  15. a
  16. b
  17. e

  18. echo 'x
  19. a
  20. b
  21. e' |awk -v aa="" 'aa' # 没有输出


  22. echo 'x
  23. a
  24. b
  25. e' |awk  '""' # 没有输出

  26. echo 'x
  27. a
  28. b
  29. e' |awk -v aa=" " 'aa'  # 全部输出
  30. x
  31. a
  32. b
  33. e
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-06-11 09:26 |只看该作者
本帖最后由 ywlscpl 于 2011-06-11 09:32 编辑

共同探讨:

awk '/a/aa' 这种形式确实比较特殊,但根据awk 'pattern{action}'这个标准awk命令行格式来分析,其实也很好理解。
因为无action,故/a/aa即为pattern,打不打印,看这个pattern的值为真还是为假就可以。
对一个pattern来说,判断为真为假,要看pattern的类型是数值还是字符串
=======关键点=======
awk有个特点,就是类型自动转换,var="0",var是字符串,但var+0后即被自动转换成数值型
同理var=0,var为数值型,但var"xx"则自动转换成字符串了
数值型pattern值的真假判断,看其值是否为0,为0则值为假,反之即为真
字符串pattern值的真假判断,看其值是否为空,为空则值为假,反之即为真。
特别需要提出的是,对一个字符串pattern来说,即使其值为0,因其非空,pattern值还是为真的,也即本题关键所在
==================

实例举证:
来看awk '/a/aa' 如何运作:
1、为一省略action的命令,即awk 'pattern',完整命令其实为awk '/a/aa{print}',打不打印就看/a/aa这个pattern值为真还是为假
2、因为/a/aa为字符串连接操作,/a/aa这个pattern类型最终为字符串,因aa这个变量值为空,故这个pattern值在/a/匹配时值为字符串"1",不匹配时为字符串"0",字符串非空即为真,故其值永远为真,所以打印所有行
  1. ywlscpl@ubuntu:~$ echo 'a
  2. > b
  3. > c' | awk '/a/aa'
  4. a
  5. b
  6. c
复制代码
再来看一下pattern值为数值型时的情况:
awk '/a/+0' 如何运作:
1、为一省略action的命令,即awk 'pattern',完整命令其实为awk '/a/+0{print}',打不打印就看/a/+0这个pattern值为真还是为假
2、因为/a/+0是数值操作,/a/+0这个pattern类型最终为数值型,故这个pattern值在/a/匹配时值为1+0,不匹配时为0+0,故其在/a/匹配时打印,不匹配时不打印
  1. ywlscpl@ubuntu:~$ echo 'a
  2. b
  3. c' | awk '/a/+0'
  4. a
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-06-11 12:54 |只看该作者
回复 6# ywlscpl


    受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP