zoukankan      html  css  js  c++  java
  • 关于awk的范围模式功能问题

    关于awk的范围模式功能问题

    man awk中这样写到

    The pattern1, pattern2 form of an expression is called a range pattern. It matches all input records starting with a record that matches pattern1, and continuing until a record that matches pattern2, inclusive. It does not combine with any other sort of pattern expression.

    表达式的pattern1,pattern2形式称为范围模式。 它匹配所有输入记录,从与pattern1匹配的记录开始,并持续到与pattern2匹配的记录(包括)。 它不与任何其他类型的模式表达式组合。


    [root@localhost ~]# awk '/aaa/,/bbb/{print}' file
    aaa
    grge
    ddd
    bbb
    aaa gege
    ccc
    bbb
    aaa gregeg
    eee
    bbb
    这里的/bbb/并没有起作用,执行了从/aaa/一直匹配到最后一行

    [root@localhost ~]# awk '/aaa/,/ccc/{print}' file
    aaa
    grge
    ddd
    bbb

    aaa gege
    ccc
    aaa gregeg
    eee
    bbb
    这里/ccc/并没有起作用,跟/bbb/一样,","起作用了,但/bbb/没有匹配到结果


    按照awk的man文档说明,awk '/aaa/,/bbb/' file结果应该是
    aaa
    grge
    ddd
    bbb

    可是这里的结果却是到最后一行,是不是/bbb/这个pattern并没有匹配到
    [root@localhost ~]# seq 9 | awk /3/,/7/
    3
    4
    5
    6
    7
    当每行内容不同,awk的范围模式能正确执行
    [root@localhost ~]# seq 10 | awk /1/,/7/
    1
    2
    3
    4
    5
    6
    7
    10
    当有重复行时,范围模式会将重复结果显示

    以上是我遇到的一些疑惑,询问了大神,得到下面的解释


    # awk '/aaa/,/bbb/{print}' file
    aaa
    grge
    ddd
    bbb
    aaa gege
    ccc
    bbb
    aaa gregeg
    eee
    bbb


    [root@localhost ~]# awk '/aaa/,/ccc/{print}' file
    aaa
    grge
    ddd
    bbb

    aaa gege
    ccc
    aaa gregeg
    eee
    bbb

    $ seq 20 | awk '/3/,/7/{print}'
    3
    4
    5
    6
    7
    13
    14
    15
    16
    17

    $ seq 15 | awk '/3/,/7/{print}'
    3
    4
    5
    6
    7
    13
    14
    15

    $ seq 15 | awk '/1/,/2/{print}'
    1
    2
    10
    11
    12
    13
    14
    15

    $ seq 23 | awk '/1/,/2/{print}'
    1
    2
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    这里的最后一行匹配结果有点意外,在同一行里,有1,也有2,并且2在前面,但还是匹配到了;猜测awk在同一行使用范围匹配时不分顺序

    总结一下,awk的范围模式其实很好用的,但有多行内容重复时,结果就要注意了,awk将进行全文匹配
    还有就是awk的范围模式其实sed也有,但这两者有区别,awk的范围匹配能将同一行结果匹配,但sed不能匹配同一行的内容

  • 相关阅读:
    虚拟机安装Ubuntu 18.04.1 LTS教程
    Ubuntukylin-16.04.4设置root用户自动登陆
    git 删除本地分支,远程分支,创建tag
    elementui多选后无法再选择或者取消
    git分支改名oldName改为newName
    js前端流的方式下载execl
    vue实现网页导出pdf
    vue下载图片
    js原生方法 document.execCommand实现复制
    js原生方法 document.execCommand实现复制
  • 原文地址:https://www.cnblogs.com/irockcode/p/7390191.html
Copyright © 2011-2022 走看看