从花括号中的文本中获取多个匹配项

时间:2017-08-14 14:48:20

标签: regex

我有这个示例文件:

authoritative;

subnet x.x.x.x netmask x.x.x.x {
    range x.x.x.x x.x.x.x;
    deny unknown-clients;
    default-lease-time 86400;
    max-lease-time 86400;
    option domain-name "bla";
    option domain-name-servers x.x.x.x;
    option broadcast-address x.x.x.x;
    option subnet-mask x.x.x.x;
    option routers x.x.x.x;

    host host1 {
        hardware ethernet 00:e1:4c:68:00:53;
        fixed-address 1.1.1.1;
    }

    host host2 {
        hardware ethernet 01:e2:4d:69:01:54;
        fixed-address 2.2.2.2;
    }

    host host3 {
        hardware ethernet 02:e3:4e:70:02:55;
        fixed-address 3.3.3.3;
    }

    host host4 {
        hardware ethernet 03:e4:4f:71:03:56;
        fixed-address 4.4.4.4;
    }

    host host5 {
        hardware ethernet 04:e5:5f:72:04:57;
        fixed-address 5.5.5.5;
    }
}

现在我正在尝试从主机x块中提取MAC地址和IP地址部分。当我使用这个文件结构(包括newLines)时,它根本不匹配......这是我稍后会解决的问题。 但是现在我很难得到所有的比赛。 这是我到目前为止:Link to MyRegex 正如您所看到的,$ 1和$ 2包含最后的mac / ip地址条目。 但是如何获取示例文件中所有条目的匹配项? 我确定我错过了必不可少的东西......

非常感谢!

4 个答案:

答案 0 :(得分:1)

哇你的正则表达式看起来过度。更简单的是:

hardware ethernet ([0-9a-f:]+); fixed-address ([0-9\.]+);

它匹配所有的ips和MAC地址。 RegExr

答案 1 :(得分:1)

host.*?\{\s*hardware ethernet\s+(?:((?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2});\s*fixed-address\s+((?:\d{1,3}.){3}\d{1,3}));\s*\}

Tested here

<强>说明

\s*\}\s*\}你在模式的最后匹配了一个右括号。

[0-255]转换为0到2或5之间的任何数字。不是你想要的。在这里使用\d{1,3}会更容易。

\sfixed-address您需要\s*fixed-address,因为fixed-address之前可能有多个空格。

答案 2 :(得分:1)

您可以明确地写出字符串的一部分,以便比您当前拥有的字符串更容易捕获:

(hardware ethernet [\da-f:]+;) (fixed-address [\d\.]+;)

这样您就有了两个捕获组,因此您可以轻松地分别获取MAC地址和IP地址。

答案 3 :(得分:1)

因为你提到最终使用awk这是一个有效的工作:

awk '/^[ \t]*host /{hostblock=1; next} hostblock && /}/{hostblock=0} !hostblock{next}
    {gsub(/;/, "", $NF)} /hardware ethernet/{mac[++i]=$NF} /fixed-address/{ip[++j]=$NF}
END{for (k=1; k<i; k++) print mac[k], ip[k]}' file

00:e1:4c:68:00:53 1.1.1.1
01:e2:4d:69:01:54 2.2.2.2
02:e3:4e:70:02:55 3.3.3.3
03:e4:4f:71:03:56 4.4.4.4