В данной статье мы рассмотрим основы работы с регулярными выражениями и их применение на маршрутизаторах серии ME.
Regexp (регулярные выражения) используются для поиска, сопоставления и манипуляций с текстовой информацией. Они представляют собой шаблоны символов, которые позволяют осуществлять более точный и гибкий поиск определенных паттернов в тексте.
Приведем некоторые наборы символов, специальных символов и символов повторения, которые будем использовать в качестве примеров:
\d - любая цифра; \s - пробельные символы; \w - любая буква, цифра или нижнее подчеркивание; + - одно или более повторений предшествующего элемента; {n} - ровно n повторений предшествующего элемента; {n,m} - от n до m повторений предшествующего элемента; . - любой символ, кроме символа новой строки ^ - начало строки $ - конец строки a|b - элемент a или b
В качестве первого примера, рассмотрим вывод команды show route:
0/ME5100:R1# sh route Mon Jan 22 05:29:40 2024 i L2 6.6.6.6/32 via 10.0.1.6 [116/10], 01h11m55s, te0/0/20.2101 i L2 10.0.17.4/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101 i L2 10.0.17.8/30 via 10.0.1.6 [116/20], 01h11m42s, te0/0/20.2101 i L2 10.0.17.12/30 via 10.0.1.6 [116/20], 01h11m42s, te0/0/20.2101 i L2 10.0.17.16/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101 i L2 10.0.17.20/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101 B BV 192.168.41.0/24 via 1.0.0.1 [200/0], 00h45m10s C 192.168.42.0/24 is directly connected, 00h45m37s, te0/0/11.10042 L 192.168.42.1/32 is directly connected, 00h45m37s, te0/0/11.10042 B BV 192.168.43.0/24 via 1.0.0.3 [200/0], 00h45m09s B BV 192.168.168.41/32 via 1.0.0.1 [200/2], 00h45m03s B BE 192.168.168.42/32 via 192.168.42.2 [20/0], 00h45m09s, te0/0/11.10042 B BV 192.168.168.43/32 via 1.0.0.3 [200/0], 00h45m09s
Произведем фильтрацию всех ISIS Level-2 маршрутов приходящих с te0/0/20.2101.
0/ME5100:R1# sh route | include "L2\s.+1$" Mon Jan 22 05:29:40 2024 i L2 6.6.6.6/32 via 10.0.1.6 [116/10], 01h11m55s, te0/0/20.2101 i L2 10.0.17.4/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101 i L2 10.0.17.8/30 via 10.0.1.6 [116/20], 01h11m42s, te0/0/20.2101 i L2 10.0.17.12/30 via 10.0.1.6 [116/20], 01h11m42s, te0/0/20.2101 i L2 10.0.17.16/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101 i L2 10.0.17.20/30 via 10.0.1.6 [116/20], 01h10m55s, te0/0/20.2101
В данном выражении "L2" обозначает ISIS level-2 маршруты, далее идет /s обозначает пробел, .(точка) - это спецсимвол обозначающий любой символ кроме новой строки, если мы скомбинируем .+, то это будет обозначать повторение символа сколько угодно раз, но не менее 1 (тем самым можно вывести всю строку до ее конца), а 1$ обозначает, что конец строки должен быть 1.
Так на примере команды show hw-module maximum выберем строки с IPv4, IPv6 и BFD, используя только логическое "или", и выведем значения занятых ресурсов только для этих строк:
0/ME5100:R1# sh hw-module max | inc IPv4|IPv6|BFD|---|Res Thu Jan 25 09:42:27 2024 Resource Current Configured Approx. Cap. Used ----------------------- ------------ ------------ ------------- ----- BFD timers 47 N/S N/S 1 BFD local RX/TX timers 8 N/S N/S 2 BFD source addresses 47 47 N/S 1 IPv4 flows 262144 441520 N/S 4 IPv6 flows 0 0 N/S 0 IPv4 routes 1289709 1289709 4108434 10 IPv6 routes 32768 32768 1908182 1
Далее рассмотрим ситуацию, когда из команды "show interface" нам необходимо отфильтровать название интерфейса и его состояние, мак адрес, а так же IP адрес:
В данном выражении (Ten|Mgmt0) выражает логическое "или" , в нашем случае или mgmt интерфейсы или te. Это первое условие, которым мы выведем название и состояние интерфейсов. :\w{2}$ - в этом выражении мы сообщаем, что конечными 2 символами должны быть любые буквы или цифры(Что как раз характеризует MAC адрес и). Последним условием является строка, в которой есть запись IPv4.
При работе с лог файлом в некоторых случая полезно узнать, какие команды и с какого IP адреса были введены в конкретную дату.В качестве примера приведем выражение, которое выводит все введеные команды на маршрутизаторе за 25 января 2024 года. Для этого введем следующее выражение:
0/ME5100:R1# show logging | include "\s.+2024-\d{2}-25.+klish.+\d+\.\d+\.\d+\.\d+" Thu Jan 25 10:03:34 2024 2024-01-25T07:03:08.390955+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show logging last 100' 2024-01-25T07:03:13.113257+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show debug' 2024-01-25T07:03:17.837535+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'no debug all' 2024-01-25T07:03:20.159039+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show interfaces | include Ten.+|Ten.+:\w{2}$' 2024-01-25T07:07:39.006612+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show interfaces' 2024-01-25T07:17:07.501676+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show interfaces | include Ten.+|Ten.+:\w{2}$' 2024-01-25T07:17:22.094235+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show interfaces | include Ten.+|Ten.+:\w{2}$q' 2024-01-25T07:17:27.470320+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'configure' 2024-01-25T07:17:30.953797+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/1' 2024-01-25T07:17:38.276789+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'ipv4 address 32.32.32.32/30' 2024-01-25T07:17:40.604785+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'ipv4 address 32.32.32.33/30' 2024-01-25T07:17:43.267941+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'exit' 2024-01-25T07:17:46.519867+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/2' 2024-01-25T07:17:56.460689+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'ipv4 address 32.32.32.37/30' 2024-01-25T07:17:57.403909+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'exit' 2024-01-25T07:18:00.279669+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/3' 2024-01-25T07:18:06.676623+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'ipv4 address 32.32.32.41/30' 2024-01-25T07:18:07.755558+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T07:18:09.539565+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'end' 2024-01-25T07:18:10.290580+00:00 klish[920][31139]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] user selected 'n' for command 'end' 2024-01-25T09:01:49.409547+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show hw-module maximum' 2024-01-25T09:06:27.836005+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show logging' 2024-01-25T09:06:45.464148+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show logging last 1000' 2024-01-25T09:07:25.532752+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'configure' 2024-01-25T09:07:30.044573+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/1' 2024-01-25T09:07:30.944384+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'shutdown' 2024-01-25T09:07:32.105397+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:33.552675+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'no shutdown' 2024-01-25T09:07:34.376419+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:35.288405+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'exit' 2024-01-25T09:07:37.511280+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/2' 2024-01-25T09:07:38.305067+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'shutdown' 2024-01-25T09:07:39.105240+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:40.464655+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'no shutdown' 2024-01-25T09:07:41.560299+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:42.352503+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'exit' 2024-01-25T09:07:47.038822+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'interface tengigabitethernet 0/0/1-6' 2024-01-25T09:07:48.608276+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'shutdown' 2024-01-25T09:07:49.376317+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:51.224963+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'no shutdown' 2024-01-25T09:07:52.400236+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'commit' 2024-01-25T09:07:53.808675+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'end' 2024-01-25T09:34:47.801062+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'show bgp' 2024-01-25T09:34:49.431859+00:00 klish[920][20353]: %KLISH-I-COMMAND: From klish terminal [user='admin' host='192.168.16.26' terminal='telnet' vrf='mgmt-intf'] command: 'quit' 0/ME5100:R1#