Cisco CLI/Фильтрация вывода команд

Материал из Xgu.ru

Перейти к: навигация, поиск
Автор: Наташа Самойленко


Шпаргалка по фильтрам
Шпаргалка по grep + alias

Статья будет полезна больше всего тем, кто мало использует, или почти не использует фильтры. Но, скорее всего, даже те, кто пользуется фильтрами регулярно, найдут для себя что-то новое и полезное.

Наверное, практически каждый, кто работал с 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