+ -
当前位置:首页 → 问答吧 → awk疑问

awk疑问

时间:2011-04-19

来源:互联网

看了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里面的多个{}是怎么执行的,能简单解释下吗?
复制代码

作者: unixthisyear   发布时间: 2011-04-19

第一个{}中什么都没有,就是不打印

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

作者: chenbin200818   发布时间: 2011-04-19

本帖最后由 ywlscpl 于 2011-04-19 11:52 编辑

回复 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的值

作者: ywlscpl   发布时间: 2011-04-19

本帖最后由 unixthisyear 于 2011-04-19 12:36 编辑


QUOTE:
命令行下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]#
复制代码

作者: unixthisyear   发布时间: 2011-04-19

回复 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
复制代码

作者: yinyuemi   发布时间: 2011-04-19

回复 unixthisyear


    疑问是什么?

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

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

作者: ywlscpl   发布时间: 2011-04-19

var=xx这样的赋值语句作为pattern是比较特殊的
先执行赋值操作,然后把xx作为这个pattern的值

作者: ywlscpl   发布时间: 2011-04-19



QUOTE:
回复  unixthisyear


    疑问是什么?

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

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



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

作者: unixthisyear   发布时间: 2011-04-19

回复 unixthisyear


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

作者: ywlscpl   发布时间: 2011-04-19



QUOTE:
回复  unixthisyear


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




    同意!pattern和action总要有一,否则就无法控制awk了

作者: yinyuemi   发布时间: 2011-04-19

回复 unixthisyear




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


只省略了pattern,action为{}
所以awk'{}' file即awk '1{}' file

作者: ywlscpl   发布时间: 2011-04-19

学习了  :lol:

作者: unixthisyear   发布时间: 2011-04-19