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不能匹配同一行的内容

  • 相关阅读:
    [LINUX-05]Linux的进程线程及调度
    如何感性地理解EM算法?
    [LINUX-04]linux进程、调度、线程、进程上下文等几点理解
    centos定时删除log文件
    关于 Nginx 配置的一些疑惑, Nginx 根据cookie 进行rewrite
    oracle中如何创建表的自增ID(通过序列)
    Windows下PHP7/5.6以上版本 如何连接Oracle 12c,并使用PDO
    Tomcat不能访问ln -s软连接文件夹的前因后果
    rm命令删除文件时排除特定文件
    nginx中的url转发
  • 原文地址:https://www.cnblogs.com/irockcode/p/7390191.html
Copyright © 2011-2022 走看看