Cisco CLI/Фильтрация вывода команд
Источник:http://xgu.ru/wiki/Cisco_CLI/%D0%A4%D0% ... 0%BD%D0%B4
Cisco CLI/Фильтрация вывода команд
Шпаргалки по фильтрам
Статья будет полезна больше всего тем, кто мало использует, или почти не использует фильтры. Но, скорее всего, даже те, кто пользуется фильтрами регулярно, найдут для себя что-то новое и полезное.
Наверное, практически каждый, кто работал с 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