【问题标题】:How can I find the match string in pattern(AWK)?如何在模式(AWK)中找到匹配字符串?
【发布时间】:2015-07-23 00:44:37
【问题描述】:

我有一个文本文件,其模式starting '-- Host'ending ';',这种模式在文件中出现了很多次,如下所示:

-- 主机(第一)Sid(queen1)

-- 王子公主#/king 1/1

;

-- 主机(第一)Sid(queen2)

-- 王子公主#/king 2/2

;

-- 主机(第一)Sid(queen3)

-- dir princess#/king 3/3

;

我想要的结果如下:

queen1 1/1

queen2 2/2

queen3 3/3

使用 AWK,我想我可以像下面这样指定包含此模式的块。但是,将第二个模式放入模式时出错。

你能帮我完成这个要求吗?谢谢!

BEGIN {
}

/-- Host/,/;/ { /prince/ { print $3 } }

END 

【问题讨论】:

    标签: regex awk


    【解决方案1】:
    $ awk -F'[ ()]+' '/-- Host/,/;/ { if (/-- Host/) printf "%s ",$5; else if (/prince/) print $4;}' file
    queen1 1/1
    queen2 2/2
    queen3 3/3
    

    工作原理

    • -F'[ ()]+'

      这告诉 awk 使用任意数量的空格和括号的任意组合作为字段分隔符。

    • /-- Host/,/;/

      这只会选择以-- Host 开头并以; 结尾的行组。大括号中的命令仅针对这些组中的行执行。

    • { if (/-- Host/) printf "%s ",$5; else if (/prince/) print $4;}

      如果该行包含-- Host,那么我们打印它的第五个字段。否则,如果它包含prince,我们打印它的第四个字段。

    【讨论】:

    • 完美!这正是我想知道的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多