我们正在努力解决一些 DHCP 问题,我正在使用 Python 和正则表达式来解析 dhcpd.leases 文件。我想编写一个正则表达式来捕获每个租约(请参阅底部的文件示例)块,然后捕获 IP 地址和 MAC。我的正则表达式知识很初级,但我认为我走在正确的轨道上。到目前为止我所拥有的并没有捕捉到一切:
到目前为止的代码:
import sys, re
fp = '/Users/smitty/Dropbox/Company/Network/DHCP-Info/dhcpd.leases'
f = open(fp)
ftext = f.read()
p = re.compile(ur'(lease\s([\d]*.*).*\n.*\n.*\n.*\n.*\n.*ethernet\s(.*);*.\n.*\n.*})')
raw_record = []
parsed_record = {}
for match in re.findall(p, ftext):
raw_record.append(match)
for record in raw_record:
m = re.search(p, record)
parsed_record[m.group(2)] = m.group(3)
plaintext_record = []
for ip, mac in parsed_record.iteritems():
plaintext_record.append("IP: {0} MAC: {1}".format(ip, mac))
Run Code Online (Sandbox Code Playgroud)
dhcpd.leases 文件的示例块:
lease 192.168.124.118 {
starts 1 2014/12/01 12:42:49;
ends 1 2014/12/01 20:42:49;
tstp 1 2014/12/01 20:42:49;
binding state free;
hardware ethernet 00:0c:29:d5:ff:cb;
uid "\001\000\014)\325\377\313";
}
lease 192.168.124.117 {
starts 5 2015/05/01 18:49:10;
ends 6 2015/05/02 02:49:10;
tstp 6 2015/05/02 02:49:10;
binding state free;
hardware ethernet 00:0c:29:85:6f:62;
uid "\001\000\014)\205ob";
}
lease 192.168.124.116 {
starts 5 2015/06/05 14:48:40;
ends 5 2015/06/05 22:48:40;
tstp 5 2015/06/05 22:48:40;
binding state free;
hardware ethernet 00:0c:29:d1:3e:0d;
uid "\001\000\014)\321>\015";
}
lease 192.168.123.200 {
starts 5 2012/07/13 11:54:46;
ends 5 2012/07/13 11:57:42;
tstp 5 2012/07/13 11:57:42;
binding state free;
hardware ethernet 88:c6:63:c6:08:52;
uid "\001\210\306c\306\010R";
}
Run Code Online (Sandbox Code Playgroud)
我也忍不住觉得我在这里的约定无处不在(创建一个列表,然后创建一个字典,然后再创建一个列表)。
打开“多行”模式以简化表达式并避免检查租约内的每个换行符并将 IP 和 MAC 地址捕获到保存组中:
import re
pattern = re.compile(r"lease ([0-9.]+) {.*?hardware ethernet ([:a-f0-9]+);.*?}", re.MULTILINE | re.DOTALL)
with open("/Users/smitty/Dropbox/Company/Network/DHCP-Info/dhcpd.leases") as f:
for match in pattern.finditer(f.read()):
print(match.group(1), match.group(2))
Run Code Online (Sandbox Code Playgroud)
印刷:
192.168.124.118 00:0c:29:d5:ff:cb
192.168.124.117 00:0c:29:85:6f:62
192.168.124.116 00:0c:29:d1:3e:0d
192.168.123.200 88:c6:63:c6:08:52
Run Code Online (Sandbox Code Playgroud)