我正在尝试编写一个正则表达式来解析由我们几百台路由器生成的日志文件。日志是一个脚本,用于尝试ping通环境中的每个其他路由器。这是为了证明我们不能对环境中的每个其他路由器执行ping操作。日志看起来与以下摘录类似(只是更大)。
Interface Name = INTNET1
IP Address = 192.168.200.200,
---PING Section---
PING 192.168.200.200: 56 data bytes
64 bytes from 192.168.200.200: icmp_seq=0. time=0. ms
64 bytes from 192.168.200.200: icmp_seq=1. time=0. ms
----192.168.200.200 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms) min/avg/max = 0/0/0
no answer from 192.168.12.13
no answer from 192.168.151.1
no answer from 192.168.19.1
no answer from 192.168.84.1
64 bytes from 192.168.100.100: icmp_seq=0. time=0. ms
64 bytes from 192.168.100.100: icmp_seq=1. time=0. ms
----192.168.100.100 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms) min/avg/max = 0/0/0
因为脚本中列出了所有路由器,所以每个路由器都会ping通自己并收到肯定答复。使用它来收集路由器的mgmt。 IP:
IP\sAddress\s*\=\s*(?<MGMTIP>.*)
我想通过以下模式(PING Statistics行)的匹配来否定超前
\-\-\-\-(.*)\-\-\-\-
,并且仅在地址与命名组不匹配时才匹配。 我已经破解了一段时间,但似乎无法使其正常工作。
编辑: 我想知道我是否过于复杂。在整个字符串块中,我真正需要的是用此模式匹配任何行:
\-\-\-\-(.*)\-\-\-\-
但是,如果与该模式中的组1不匹配(与发出ping命令的主机的IP地址匹配),则仅捕获'(。*)'部分
IP\sAddress\s*\=\s*(.*)
答案 0 :(得分:1)
我不确定您使用的是哪种语言,所以我无法给出确切的答案,但是使用单个模式确实很难做到这一点,因此我建议使用2。您编写的第一个模式将捕获您的IP。
IP\sAddress\s*\=\s*(?<MGMTIP>.*)
我们会将其保存到一个名为“ myIP”的变量中(如果您真的很担心准确性,则需要转义“ myIP”中的每个.
,因为使用正则表达式.
可以匹配任何角色。不过这没关系)
您的下一个模式应为"(?s)----" + myIP + "\sPING\sStatistics----.*?(?=----\d+\.\d+\.\d+\.\d+\sPING\sStatistics----|\Z)"
这将匹配您不需要的每个部分。您可以将任何匹配项替换为""
,这将使您拥有所有要查找的部分。