- ru
- Language: en
- Documentation version: latest
Разбор вывода команды show ip dhcp snooping с помощью именованных групп
Рассмотрим еще один пример использования именованных групп. В этом примере задача в том, чтобы получить из вывода команды show ip dhcp snooping binding поля: MAC-адрес, IP-адрес, VLAN и интерфейс.
В файле dhcp_snooping.txt находится вывод команды show ip dhcp snooping binding:
MacAddress IpAddress Lease(sec) Type VLAN Interface
------------------ --------------- ---------- ------------- ---- --------------------
00:09:BB:3D:D6:58 10.1.10.2 86250 dhcp-snooping 10 FastEthernet0/1
00:04:A3:3E:5B:69 10.1.5.2 63951 dhcp-snooping 5 FastEthernet0/10
00:05:B3:7E:9B:60 10.1.5.4 63253 dhcp-snooping 5 FastEthernet0/9
00:09:BC:3F:A6:50 10.1.10.6 76260 dhcp-snooping 10 FastEthernet0/3
Total number of bindings: 4
Для начала попробуем разобрать одну строку:
In [1]: line = '00:09:BB:3D:D6:58 10.1.10.2 86250 dhcp-snooping 10 FastEthernet0/1'
В регулярном выражении именованные группы используются для тех частей вывода, которые нужно запомнить:
In [2]: match = re.search('(?P<mac>\S+) +(?P<ip>\S+) +\d+ +\S+ +(?P<vlan>\d+) +(?P<port>\S+)', line)
Комментарии к регулярному выражению:
(?P<mac>\S+) +
- в группу с именем ‘mac’ попадают любые символы, кроме пробельных. Получается, что выражение описывает последовательность любых символов до пробела(?P<ip>\S+) +
- тут аналогично: последовательность любых непробельных символов до пробела. Имя группы ‘ip’\d+ +
- числовая последовательность (одна или более цифр), а затем один или более пробеловсюда попадет значение Lease
\S+ +
- последовательность любых символов, кроме пробельныхсюда попадает тип соответствия (в данном случае все они dhcp-snooping)
(?P<vlan>\d+) +
- именованная группа ‘vlan’. Сюда попадают только числовые последовательности с одним или более символами(?P<port>.\S+)
- именованная группа ‘port’. Сюда попадают любые символы, кроме whitespace
В результате, метод groupdict вернет такой словарь:
In [3]: match.groupdict()
Out[3]:
{'int': 'FastEthernet0/1',
'ip': '10.1.10.2',
'mac': '00:09:BB:3D:D6:58',
'vlan': '10'}
Так как регулярное выражение отработало как нужно, можно создавать скрипт. В скрипте перебираются все строки файла dhcp_snooping.txt, и на стандартный поток вывода выводится информация об устройствах.
Файл parse_dhcp_snooping.py:
# -*- coding: utf-8 -*-
import re
#'00:09:BB:3D:D6:58 10.1.10.2 86250 dhcp-snooping 10 FastEthernet0/1'
regex = re.compile('(?P<mac>\S+) +(?P<ip>\S+) +\d+ +\S+ +(?P<vlan>\d+) +(?P<port>\S+)')
result = []
with open('dhcp_snooping.txt') as data:
for line in data:
match = regex.search(line)
if match:
result.append(match.groupdict())
print('К коммутатору подключено {} устройства'.format(len(result)))
for num, comp in enumerate(result, 1):
print('Параметры устройства {}:'.format(num))
for key in comp:
print('{:10}: {:10}'.format(key,comp[key]))
Результат выполнения:
$ python parse_dhcp_snooping.py
К коммутатору подключено 4 устройства
Параметры устройства 1:
int: FastEthernet0/1
ip: 10.1.10.2
mac: 00:09:BB:3D:D6:58
vlan: 10
Параметры устройства 2:
int: FastEthernet0/10
ip: 10.1.5.2
mac: 00:04:A3:3E:5B:69
vlan: 5
Параметры устройства 3:
int: FastEthernet0/9
ip: 10.1.5.4
mac: 00:05:B3:7E:9B:60
vlan: 5
Параметры устройства 4:
int: FastEthernet0/3
ip: 10.1.10.6
mac: 00:09:BC:3F:A6:50
vlan: 10