About Me

My photo
CCSI #33991, CCNPV, MCTS: Lync, dCAA, LCSP, LCTP

Несколько слов о Unified Communications от компаний Cisco, Microsoft, Digium и некоторых других. Надеюсь что-то вам пригодится. Буду благодарен за комментарии.

Wednesday, July 13, 2011

Использование pipe (grep) в Cisco IOS

Добрый день! Сегодня хотел бы написать немного о такой опции в Cisco IOS, как "pipe", которая позволяет выводить лишь необходимую нам информацию. В linux'е реализована с помощью команды "grep". Речь пойдет об использовании регулярных выражений в IOS.





Зачем она? Если у Вас конфиг на 5 экранов, тогда ответ - она не нужна, но если нужно отсеять что-то из 20-50 экранного конфига, тогда без неё очень сложно. Использование регулярных выражений чаще всего можно встретить при конфигурации протокола BGP, диал-пиров для маршрутизации телефонного звонка или в случае большого количества правил трансляции номеров, когда нам необходимо найти использующееся правило.

Несколько слов о специальных символах регулярных выражений

+ предыдущий символ (группа) встречается 1 или больше раз
123+ (123, 1233, 12333, 123333 и т.д. будут подходить для выражения)
* предыдущий символ (группа) встречается 0 или больше раз
123* (12, 123, 1233, 12333, 123333 и т.д. будут подходить для выражения)
? предыдущий символ (группа) встречается 0 или 1 раз
123? (12 и 123 будут подходить)
() круглые скобки позволяют создать группу символов
1(23)* (1, 123, 12323, 1232323 и т.д. будут подходить для выражения)
. один любой символ
1(.)3 (123, 1d3, 1j3, 183, 1o3 и т.д.)
[] любой из символов в квадратных скобках
1[135] (11, 13, 15)
1[1-3] (11, 12, 13)

^ все что начинается с...
^5383.... (все что начинается с 5383)
$ все что заканчивается на ...
....5383$ (все что заканчивается на 5383)
\ отменяет значение специального символа
^\+ (найти все что начинается на символ +)

Итак, давайте начнем с простого
show run | ?

 append    Append redirected output to URL (URLs supporting append operation only)
  begin     Begin with the line that matches
  exclude   Exclude lines that match
  format    Format the output using the specified spec file
  include   Include lines that match
  redirect  Redirect output to URL
  section   Filter a section of output
  tee       Copy output to URL
 
Вот что Вы увидите, когда введете show run (на роутере) с контекстной подсказкой.
Я использую begin, include, section (include, exclude).

begin (b)        выводить все начиная со строки которая совпала
include (i)        выводить только строку которая совпала
section (s)        в случае совпадения в команде входа в какой-то подрежим конфигурации выводить всю секцию для это подрежима (e.g. interface config)
    e.g. interface fastethernet 0/0
          ip address 1.1.1.1
          description To ISP
         
Замечание!
  В коммутаторах cisco команды section нет.

Часто бывает ситуация когда нужно посмотреть в таблицу маршрутизации и затем (глядя на небольшой вывод) что-то ввести в CLI. Я бы сделал это так

HQ-2#show ip route | b Gate
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 28 subnets, 3 masks
S        10.0.250.201/32 [1/0] via 10.12.9.201
D        10.1.1.0/24 [90/2172416] via 10.12.1.101, 10:05:20, Serial0/1/0.111
D        10.1.2.0/24 [90/2172416] via 10.12.1.101, 10:05:20, Serial0/1/0.111
D        10.1.3.0/24 [90/2172416] via 10.12.1.101, 10:05:20, Serial0/1/0.111


Вместо этого....

HQ-2#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, + - replicated route

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 28 subnets, 3 masks
S        10.0.250.201/32 [1/0] via 10.12.9.201
D        10.1.1.0/24 [90/2172416] via 10.12.1.101, 10:06:08, Serial0/1/0.111
D        10.1.2.0/24 [90/2172416] via 10.12.1.101, 10:06:08, Serial0/1/0.111
D        10.1.3.0/24 [90/2172416] via 10.12.1.101, 10:06:08, Serial0/1/0.111
D        10.1.4.0/24 [90/2684416] via 10.12.1.101, 10:06:08, Serial0/1/0.111

Вывод, с уже надеюсь успевшей надоесть Вам легендой.

Логическое "И"
Немного сложнее... допустим нам нужно посмотреть интерфейсы на сконфигурированный тип (DCE/DTE) и частоту (clock rate). И для того чтобы понять зачем я трачу Ваше время, введите сначала команду

show controllers

IOS выдаст слишком много не нужной информации. Теперь попробуйте

show controllers | section (Seria|cloc)

В данном примере используется ISR2811 с двумя модулями WIC-2T установленными в нулевом слоте.

PSTN-1#show controllers | s (Serial|clock)
Serial Management Interface Registers (0xB4002000)
Serial Management Interface Registers (0xB4002000)
Interface Serial0/0/0
DCE V.35, clock rate 128000
Interface Serial0/0/1
DCE V.35, clock rate 128000
Interface Serial0/1/0
DCE V.35, clock rate 128000
Interface Serial0/1/1
DCE V.35, clock rate 128000

Несколько примеров для того чтобы увидеть правила в действии:
* Чтобы вывести все ip-адреса в конфиге
 sh run | i [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+

* Все интерфейсы в неактивном состоянии смотреть так...
show ip interface brief | include down

* Просмотр конфигурации ospf протокола
show running-config | section ospf

Теперь, давайте рассмотрим ситуацию, когда вывода слишком много даже при отсеивании с помощью одного правила.

Вы видели конфиги маршрутизаторов с использованием множества dial-peers, voice translation-rules, огромнейшей (BGP) таблицей маршрутизации или чего-то "многословного". Поиск неисправностей в такой среде это очень муторное дело. Давайте пытаться облегчить себе жизнь.

Вы хотите узнать есть ли у роутера маршрут для сети 154.4.х.х/24 через интерфейс serial 0/1/1 (представте что маршрутов больше тысячи).

Тогда нужно ввести примерно следущее...

PSTN-1#show ip route | i 150\.4(.)*\/24(.)*Ser(.)*0/1/1
C        150.4.132.0/24 is directly connected, Serial0/1/1

Где (.)* значит ноль или больше любых символов
 \ используеться для того чтобы указать что "." точка или "/" (shash) в данном случае не является спец. символом, а должны встречаться в тексте "как есть".
   А "Ser(.)*" вместо Serial я сделал для того чтобы показать универсальный паттерн на случай, если не нужно точно писать слово.
  
И в завершение, если Вы постоянно конфигурируете какое-либо одно устройство полезным может стать словарь "элиасов" (alias dictionary).

conf t
alias exec sion show ip ospf neighbors
alias exec deltac show archive config differences system:running-config nvram:startup-config
alias exec sir show ip route | begin Gateway
! may be this scary
alias exec shrun show running-config | section exclude (voice translation-rule|voice translation-profile|dial-peer voice|telephony-service|ephone-dn|ephone|dial-peer cor|alias)

do sir

PSTN-1(confif)#do sir
Gateway of last resort is not set
      10.0.0.0/8 is variably subnetted, 15 subnets, 3 masks
C        10.0.131.0/24 is directly connected, Serial0/0/1
L        10.0.131.1/32 is directly connected, Serial0/0/1

2 comments:

  1. есть еще одно значение \
    например можно сделать такое регулярное выражение:
    # show run | in ([A-z])\1\1
    и оно выведет все строки содержащие 3 одинаковые буквы подряд:
    enable password BBB
    no aaa new-model

    ReplyDelete
  2. Спасибо. Мне очень пригодится. Не терял надежду, что фильтровать вывод можно не только begin,include,exclude и т.д. ))

    ReplyDelete