Cisco CLI/Фильтрация вывода команд
Материал из Xgu.ru
- Автор: Наташа Самойленко
Статья будет полезна больше всего тем, кто мало использует, или почти не использует фильтры. Но, скорее всего, даже те, кто пользуется фильтрами регулярно, найдут для себя что-то новое и полезное.
Наверное, практически каждый, кто работал с Cisco, когда-то использовал фильтры, а возможно даже, использует их регулярно. Тем не менее, часто вместо того, чтобы отфильтровать вывод большой команды show и посмотреть нужные пару строк, мы смотрим несколько страниц вывода.
Возможно, в каких-то ситуациях это хорошо. И, может быть, даже помогает. Но, иногда (наверное, почти всегда), такое пролистывание только мешает:
- приходится отвлекаться на посторонние куски конфигурации, тогда как вам нужно только 3 строки
- приходится скролить туда-сюда, так как части одной настройки находятся в разных местах конфигурации
- сложно выловить визуально нужную информацию в большом количестве параметров
Конечно, сначала пользоваться фильтрами может быть не совсем удобно. Хотя бы потому, что надо помнить команды (на самом деле, как правило, достаточно одного слова из команды). Но, если с ними немного разобраться, попрактиковаться в использовании, а для популярных сделать алиасы, то, скорее всего, вы уже очень редко будете смотреть полный вывод команд, когда вам нужно только пару строк.
Содержание |
[править] Фильтрация вывода команд show и more
Фильтровать в Cisco можно вывод команд show и more. Мы остановимся на примерах с командами show, но с more все будет полностью аналогично.
Синтаксис написания фильтра:
command | filter <Regular Expression>
На месте команды может быть любая команда show или more. После команды стоит pipe '|', фильтр, а затем регулярное выражение.
В Cisco есть такие фильтры (на примере show run):
- include - покажет те строки конфигурации, в которых встречается регулярное выражение
- exclude - покажет все строки конфигурации, кроме тех, где встречается регулярное выражение
- begin - покажет строки, начиная со строки в которой встречается регулярное выражение
- section (может не поддерживаться на коммутаторах) покажет раздел конфигурации, в названии которого встречается регулярное выражение
Кроме того, можно комбинировать section с include или exclude (самом деле, section include это то же самое, что и просто section).
Пример фильтра include:
r1#sh run | include ip route ip route 0.0.0.0 0.0.0.0 15.0.0.5 ip route 10.10.10.0 255.255.255.0 10.1.1.7
Пример фильтра exclude:
r1#sh ip interface brief | exclude unassigned Interface IP-Address OK? Method Status Protocol Ethernet0/0 15.0.0.1 YES NVRAM up up Ethernet0/1 10.1.1.1 YES NVRAM up up Tunnel0 10.255.0.1 YES manual up up
Пример фильтра begin:
r1#sh run | begin line line con 0 exec-timeout 0 0 logging synchronous line aux 0 line vty 0 4 login transport input all
Пример фильтра section:
r1#sh run | s ospf router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.255.255.255 area 0 alias exec ospf sh run | s ^router ospf
Если вы хотите показать всю конфигурацию, но без интерфейсов, можно сделать так:
r1#sh run | section exclude ^interface
В таком случае отобразится весь конфигурационный файл, кроме интерфейсов.
[править] Примеры использования фильтров
Наверняка вы обратили внимание, что в синтаксисе команды, после фильтра, стоит регулярное выражение. Пока что, в примерах был простейший вариант, когда в роли регулярного выражения была просто строка (подстрока).
Но мы можем пойти дальше, и использовать специальные символы, для того чтобы добиться нужного результата. Почитать о регулярных выражениях и спецсимволах можно в статье Регулярное выражение.
Например, в выводе с фильтром section, в вывод попал не только раздел настройки ospf, но и alias, который создан для вывода такого раздела по более короткой команде.
Для того чтобы отображался только раздел настройки OSPF, попробуем спецсимвол начала строки ^:
r1#sh run | s ^router ospf router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.255.255.255 area 0
Теперь alias уже не отображается, так как у него, подстрока 'router ospf' встречается не в начале строки, а в середине.
Аналогично можно использовать символ конца строки:
r1#sh ip int br | include down$ Ethernet0/2 unassigned YES NVRAM administratively down down Ethernet0/3 unassigned YES NVRAM administratively down down Tunnel3 unassigned YES unset up down Tunnel4 unassigned YES unset up down
Попробуем отобразить интерфейс с адресом 10.1.1.1:
r1#sh ip int br | i 10.1.1.1 Ethernet0/1 10.1.1.1 YES NVRAM up up Ethernet0/2 10.101.1.1 YES manual up up
Странно... Почему-то сюда попал и интерфейс с адресом 10.101.1.1. Но, если вспомнить, что после фильтра include мы пишем регулярное выражение, то все становится на свои места.
Точка в адресе обозначает любой символ. Именно поэтому адрес 10.101.1.1 тоже попал под это условие.
Для того чтобы остались только нужные маршруты, надо экранировать точку, так как это специальный символ:
r1#sh ip int br | i 10\.1\.1\.1 Ethernet0/1 10.1.1.1 YES NVRAM up up
Попробуем отфильтровать IP-адреса интерфейсов и маски. Тут есть несколько вариантов, так как есть несколько команд, где есть эта информация.
Адрес в комбинации с маской есть в конфигурационном файле. Попробуем отфильтровать:
r1#sh run | include ip address ip address 10.255.0.1 255.255.255.0 no ip address no ip address ip address 15.0.0.1 255.255.255.0 ip address 10.1.1.1 255.255.255.0 ip address 10.101.1.1 255.255.255.0 no ip address no ip address no ip address
Тут у нас две проблемы: нет названия интерфейсов и попали лишние строки 'no ip address'. Исправляем:
r1#sh run | include ^interface|^ ip address interface Tunnel0 ip address 10.255.0.1 255.255.255.0 interface Tunnel3 interface Tunnel4 interface Ethernet0/0 ip address 15.0.0.1 255.255.255.0 interface Ethernet0/1 ip address 10.1.1.1 255.255.255.0 interface Ethernet0/2 ip address 10.101.1.1 255.255.255.0 interface Ethernet0/3 interface Ethernet1/0 interface Ethernet1/1
Уже лучше, но минус в том, что есть много строк с интерфейсами, у которых нет адреса.
Если все же нужно вывести адреса и маски, без лишних интерфейсов (с учетом, что нас интересует информация только на интерфейсах, которые в состоянии up), то можно отфильтровать команду show interfaces:
r1#sh interfaces | include Internet address|line protocol is up Ethernet0/0 is up, line protocol is up Internet address is 15.0.0.1/24 Ethernet0/1 is up, line protocol is up Internet address is 10.1.1.1/24 Tunnel0 is up, line protocol is up Internet address is 10.255.0.1/24
Тут и выше мы использовали pipe | дважды. Знак | после команды работает как фильтр, а вот | далее, работает уже как знак ИЛИ. Поэтому у нас есть возможность отфильтровать строки в которых встречается одно или другое выражение.
Еще один вариант использования ИЛИ:
r1#sh cdp neighbors detail | inc --|ID|IP add|Plat ------------------------- Device ID: r2 IP address: 10.1.1.100 Platform: cisco 7206VXR, Capabilities: Router Interface: Ethernet0/1, Port ID (outgoing port): Ethernet0/1 ------------------------- Device ID: r5 IP address: 15.0.0.5 Platform: cisco 7206VXR, Capabilities: Router Interface: Ethernet0/0, Port ID (outgoing port): Ethernet0/0
В регулярных выражениях, довольно часто, может быть полезным использование квадратных скобок, для перечисления нескольких значений или диапазона.
Попробуем отфильтровать интерфейсы 0/1 и 1/1:
r1#sh interface desc | i Et[0,1]/1 Et0/1 up up To LAN Et1/1 up up Backup To LAN
Аналогично отображаем в модулях 0 и 1 интерфейсы 1,2:
r1#sh interface desc | i Et[0-1]/[1-2] Et0/1 up up To LAN Et0/2 admin down down Et1/1 up up Backup To LAN Et1/2 admin down down
Еще пример. Отображаем в модулях 0 и 1 интерфейсы 0,2,3:
r1#sh interface desc | i Et[0-1]/[0,2-3] Et0/0 up up TO ISP Et0/2 admin down down Et0/3 admin down down Et1/0 admin down down Et1/2 admin down down Et1/3 admin down down
Вы можете самостоятельно попробовать разные комбинации и, в следующий раз, когда вам надо будет посмотреть только определенные строки конфигурации или команды show, попробуйте воспользоваться фильтрами.
[править] Двойная фильтрация
Отдельно стоит по говорить о двойной фильтрации. Иногда надо отфильтровать вывод по какому-то критерию, а затем повторно отфильтровать полученные строки.
Изначально такая возможность была только в IOS-XE и IOS-XR. Но, с появлением IOS.sh (IOS shell), есть возможность сделать аналогичнуюю операцию и в IOS (IOS shell доступен не во всех версиях IOS).
Фактически с появлением IOS shell добавились несколько утилит, одна из которых grep.
Для начала надо активировать IOS shell:
r1#terminal shell
Теперь можно посмотреть какие функции появились:
r1#sh shell functions #User defined functions: #Global User functions: #Built-in functions: ... Function namespace: DEFAULT cat output data from a pipe or file to the terminal Function namespace: DEFAULT cut edit piped output ...
Нас интересует grep:
r1#sh run | grep ip route
Упс... Ничего не отображается. Не забывайте брать в кавычки команду, если в ней несколько слов:
r1#sh run | grep 'ip route' ip route 0.0.0.0 0.0.0.0 15.0.0.5 ip route 10.10.10.0 255.255.255.0 10.1.1.7 ip route 10.20.20.0 255.255.255.0 10.1.1.7 ip route 10.30.30.0 255.255.255.0 10.1.1.7 ip route 10.40.40.0 255.255.255.0 10.111.7.1
Теперь попробуем сделать двойной фильтр:
r1#sh interfaces | grep -b ^Tunnel | grep "transport MTU|^Tunnel" Tunnel0 is up, line protocol is up Tunnel transport MTU 1434 bytes Tunnel3 is up, line protocol is down Tunnel transport MTU 1476 bytes Tunnel4 is up, line protocol is down Tunnel transport MTU 1476 bytes
Первый фильтр берет вывод команды show interfaces и отображает только часть интерфейсов, начиная с тунелей. Опция -b означает то же самое, что и begin в фильтрах Cisco.
Второй фильтр берет этот вывод и фильтрует его, отображая строки, в которых встречается 'transport MTU' и слово Tunnel в начале строки.
Таким образом мы получили возможность фильтровать вывод дважды и в IOS.
Для того чтобы вам было проще попрактиковаться с grep, ниже опции, которые аналогичны фильтрам в Cisco:
- grep -- без опций дает такой же результат, как и include
- grep -v -- аналогичен фильтру exclude
- grep -b -- аналогичен фильтру begin
Аналог section тоже можно сделать с grep, только надо сделать двойной фильтр:
r1#sh run | grep -b '^router ospf' | grep -u '!' router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.255.255.255 area 0
Полезная опция -i -- она позволяет игнорировать регистр. Поэтому, такая команда тоже отработает:
r1#sh interfaces | grep -i -b ^tunnel | grep -i "transport mtu|^tunnel" Tunnel0 is up, line protocol is up Tunnel transport MTU 1434 bytes Tunnel3 is up, line protocol is down Tunnel transport MTU 1476 bytes Tunnel4 is up, line protocol is down Tunnel transport MTU 1476 bytes
Посмотреть какие еще опции поддерживает grep в Cisco можно с помощью команды man:
r1#man grep NAME grep - get regular expression SYNOPSIS grep [OPTIONS] <Regular Expression> [<file>...] DESCRIPTION The 'grep' command matches lines in the given files with the supplied regular expression, and prints matching lines. There are lots of options -b - match everything in a file after pattern -c - print a count of lines instead of matched lines -e <pat> - use <pat> as the pattern (it may have a leading minus) -h - do not print filename for each match (default) -H - print filename for each match -i - ignore case -l - print only files with match -L - print only files without match -m - match everything in a matching mode -n - print line numbers along with matches -q - quiet, only set status -s - supress printing errors -u - match everything in a file until pattern -v - invert match, print non-matching lines
Тема IOS.sh конечно же шире, чем просто grep, но пока что мы на этом заканчиваем.
[править] Partition и встроенные сегменты
Для части подрежимов в Cisco есть встроенные сегменты и вы можете посмотреть часть конфигурации не используя команду section.
Самый популярный раздел, который таким образом используется, пожалуй, sh run int:
r1#sh run int tun0 Building configuration... Current configuration : 160 bytes ! interface Tunnel0 ip address 10.255.0.1 255.255.255.0 tunnel source Ethernet0/0 tunnel destination 25.0.0.2 tunnel protection ipsec profile GRE_prof end
В Cisco определены еще пару таких разделов, но их довольно мало. Поэтому чато привычнее пользоваться фильтром section.
Кроме таких разделов, есть еще partition:
r1#sh run partition ? access-list All access-list configurations class-map All class-map configurations common All remaining unregistered configurations global-cdp All global cdp configurations interface Each Interface specific Configurations ip-as-path All IP as-path configurations ip-community All IP community list configurations ip-domain-list All ip domain list configurations ip-prefix-list All ip prefix-list configurations ip-static-routes All IP static configurations line All line mode configurations policy-map All policy-map configurations route-map All route-map configurations router All routing configurations snmp All SNMP configurations
Тут есть некоторые подрежимы, которых нет в предыдущем разделе. например, можно посмотреть настройки OSPF:
r1#sh run partition router ospf 1 Building configuration... Current configuration : 153 bytes ! Last configuration change at 10:10:13 UTC Mon Oct 12 2015 ! router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.255.255.255 area 0 ! end
Минус тут в том, что такая возможность есть не для всех подрежимов и в том, что для некоторых сегментов нужно указывать идентификатор. Например, для OSPF, указывать конкретный процесс.
В то же время, для ACL достаточно указать так:
r1#sh run partition access-list Building configuration... Current configuration : 133 bytes ! Last configuration change at 10:14:29 UTC Mon Oct 12 2015 ! ip access-list extended TEST permit icmp any any ! end
[править] Создание alias
И финальный штрих работы с фильтрами.
Для того чтобы фильтрами было удобнее пользоваться, особенно теми, которые вы используете регулярно, лучше создавать для них alias.
Alias это короткое имя для команды (с фильтром или без). Синтаксис alias такой:
alias режим <короткое имя команды> команда
Примеры alias (тут все alias в режиме exec, то есть в режиме enable):
alias exec ospf sh run | s ^router ospf alias exec bgp sh run | s ^router bgp alias exec bri show ip int bri | exc unass alias exec desc sh int desc | ex down alias exec top sh proc cpu sorted | excl 0.00%__0.00%__0.00%
Конечно же, alias могут быть полезны не только для фильтров, но и просто для длинных команд или тех, которые вы очень часто выполняете и хочется дать им короткое имя:
alias exec c conf t alias exec id show int desc
И, в завершение, создадим команду diff в Cisco:
alias exec diff sh archive config differences nvram:startup-config system:running-config
Теперь при вызове команды diff будет отображать отличие стартовой конфигурации от текущей:
r1#diff !Contextual Config Diffs: interface Ethernet0/1 +description To LAN interface Ethernet0/2 +ip address 10.101.1.1 255.255.255.0 interface Ethernet1/1 +description Backup To LAN +ip route 10.10.10.0 255.255.255.0 10.1.1.7 +ip route 10.20.20.0 255.255.255.0 10.1.1.7 +ip route 10.30.30.0 255.255.255.0 10.1.1.7 +ip route 10.40.40.0 255.255.255.0 10.111.7.1
[править] Cheat sheet
- Шпаргалка с фильтрами, примерами фильтров Cheat sheet IOS CLI filters