免费注册 查看新帖 |

Chinaunix

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

awk疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-19 11:23 |只看该作者 |倒序浏览
看了awk选择性匹配的帖子,有个疑问

  1. cat file
  2. aaa
  3. bbb
  4. ccc
  5. ddd
  6. eee
  7. fff
  8. ggg

  9. aaaa
  10. bbbb
  11. cccc
  12. dddd
  13. eeee
  14. ffff
  15. gggg

  16. [root@rhel5-iptables shell]# awk '/ddd/{print i};i=$0{}' file
  17. ccc
  18. cccc
  19. [root@rhel5-iptables shell]# awk '/ddd/{print i};i=$0' file
  20. aaa
  21. bbb
  22. ccc
  23. ccc
  24. ddd
  25. eee
  26. fff
  27. ggg
  28. hhh
  29. aaaa
  30. bbbb
  31. cccc
  32. cccc
  33. dddd
  34. eeee
  35. ffff
  36. gggg
  37. hhhh

  38. 一直不太理解awk里面的多个{}是怎么执行的,能简单解释下吗?
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-04-19 11:43 |只看该作者
第一个{}中什么都没有,就是不打印

第二的没有{}, 但是分号后有i=$0 这个结果为真 默认就将$0打印出

论坛徽章:
0
3 [报告]
发表于 2011-04-19 11:49 |只看该作者
本帖最后由 ywlscpl 于 2011-04-19 11:52 编辑

回复 1# unixthisyear


命令行下awk一般格式: awk 'pattern1{action1}pattern2{action2}...' file

1、pattern可省略,如省略默认pattern为真,如awk '{print}' 即为awk '1{print}'    (这里以1为例,非空或非0即为真)
2、action可省略,如省略默认action为print,如awk '1' 即为awk '1{print}'
3、pattern{action}中若省略{action}的,必须后面加;后再接新的一段pattern{action},如awk '1;$1==2{print}$2=3{print}',1后面有;而$2=3前的;可有可无

awk '/ddd/{print i};i=$0'为省略action的形式
即为awk '/ddd/{print i};i=$0{print}'
pattern为i=$0,pattern的值为$0的值

论坛徽章:
0
4 [报告]
发表于 2011-04-19 12:34 |只看该作者
本帖最后由 unixthisyear 于 2011-04-19 12:36 编辑
命令行下awk一般格式: awk 'pattern1{action1}pattern2{action2}...' file

1、pattern可省略,如省略默认pattern为真,如awk '{print}' 即为awk '1{print}'    (这里以1为例,非空或非0即为真)
2、action可省略,如省略默认action为print,如awk '1' 即为awk '1{print}'
3、pattern{action}中若省略{action}的,必须后面加;后再接新的一段pattern{action},如awk '1;$1==2{print}$2=3{print}',1后面有;而$2=3前的;可有可无


这里说pattern和action均可省略,还有一个疑问:

  1. [root@rhel5-iptables shell]# awk '{print}' file
  2. aaa
  3. bbb
  4. ccc
  5. ddd
  6. eee
  7. fff
  8. ggg
  9. hhh

  10. aaaa
  11. bbbb
  12. cccc
  13. dddd
  14. eeee
  15. ffff
  16. gggg
  17. hhhh
  18. [root@rhel5-iptables shell]# awk '{}' file           
  19. [root@rhel5-iptables shell]# awk '' file
  20. [root@rhel5-iptables shell]#


复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-04-19 12:51 |只看该作者
回复 4# unixthisyear


    关于i=$0,awk在执行的时候是这样的,
先给i赋值,即i=$0, 然后再进行一次判断,i是否为真,如果为真,打印当前行的$0,

你可以对比下面同一个代码对两个不同数据的处理结果:
  1. echo "1
  2. 2
  3. 3
  4. 4" |awk '/3/{print i}i=$0'
  5. 1
  6. 2
  7. 2
  8. 3
  9. 4

  10. echo "1
  11. 0
  12. 3
  13. 4" |awk '/3/{print i}i=$0'
  14. 1
  15. 0
  16. 3
  17. 4
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-04-19 13:06 |只看该作者
回复 4# unixthisyear


    疑问是什么?

awk '{}' file           action为空操作,当然没任何输出

awk '' file            pattern和action都省略了,也是空操作

论坛徽章:
0
7 [报告]
发表于 2011-04-19 13:08 |只看该作者
var=xx这样的赋值语句作为pattern是比较特殊的
先执行赋值操作,然后把xx作为这个pattern的值

论坛徽章:
0
8 [报告]
发表于 2011-04-19 13:12 |只看该作者
回复  unixthisyear


    疑问是什么?

awk '{}' file           action为空操作,当然没任何输出

awk '' file            pattern和action都省略了,也是空操作


疑问是:
awk '{}' file    不是相当于awk '1{print}' file  省略了pattern(也就是1)和action(也就是print)了 ?

论坛徽章:
0
9 [报告]
发表于 2011-04-19 13:15 |只看该作者
回复 8# unixthisyear


    我没说同时省略,照你这样理解,
每条awk语句后面后面都要追加无穷个1{print}了,因为你理解空即是同时省略了pattern和action

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
10 [报告]
发表于 2011-04-19 13:18 |只看该作者
回复  unixthisyear


    我没说同时省略,照你这样理解,
每条awk语句后面后面都要追加无穷个1{prin ...
ywlscpl 发表于 2011-04-19 13:15



    同意!pattern和action总要有一,否则就无法控制awk了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP