Regex 如何在模式(AWK)中找到匹配字符串?

Regex 如何在模式(AWK)中找到匹配字符串?,regex,awk,Regex,Awk,我有一个文本文件,模式是开始--Host'和结束';',此模式在文件中出现的次数如下: --主机(第一个)Sid(第1个) ——公主王子/国王1/1 --主机(第一个)Sid(第二个) ——公主王子/国王2/2 --主机(第一个)Sid(皇后3) --dir公主/king 3/3 我期望的结果如下: queen1 1/1 queen2 2/2 皇后区3/3 使用AWK,我想我可以指定包含此模式的块,如下所示。但是,我在将第二个模式放入模式时出错 你能帮我完成这个要求吗?谢谢 BEGIN {

我有一个文本文件,模式是开始--Host'结束';',此模式在文件中出现的次数如下:

--主机(第一个)Sid(第1个)

——公主王子/国王1/1

--主机(第一个)Sid(第二个)

——公主王子/国王2/2

--主机(第一个)Sid(皇后3)

--dir公主/king 3/3

我期望的结果如下:

queen1 1/1

queen2 2/2

皇后区3/3

使用AWK,我想我可以指定包含此模式的块,如下所示。但是,我在将第二个模式放入模式时出错

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

BEGIN {
}

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

END 
工作原理
  • -F'[()]+'

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

  • /--Host/,//

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

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

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


完美!这正是我想知道的。
$ awk -F'[ ()]+' '/-- Host/,/;/ { if (/-- Host/) printf "%s ",$5; else if (/prince/) print $4;}' file
queen1 1/1
queen2 2/2
queen3 3/3