Часто получаешь в руки железку, нужно оценить, как она наконфигурена. При этом, размер running config может быть огромным (скажем, полный дамп конфига контроллера из моей лабы в данном примере 21KB ~=29 страниц). Для первого взгляда хочется увидеть, какие секции конфига присутствуют. В качестве примера взята платформа Motorola Solutions WING5 (WLAN), но, в принципе будет работать на любой железке, где конструкция "| include" поддерживает regexp (Cisco, Motorola WING4, другие IOS-подобные интерфейсы).
Пишем:
Получаем:
Для платформы WING5 эта команда весьма актуальна, т.к. контроллер держит мастер-конфигурацию для всей сети (а это могут быть сотни, если не тысячи секций для профилей/политик/устройств/сервисов и даже других контроллеров) — копаться в полном дампе running config нереально. <IMHO>Вообще, о том насколько круто реализована структура и синхронизация конфига в WING5 (распределенная сеть), и том, какие плюшки есть в CLI для массового конфигурирования/администрирования и траблшутинга можно писать отдельный цикл статей (типа запуска централизованного сбора пакетов со всех точек удаленного сайта командой в одну строчку). Возвращаться к сетям третьего поколения теперь вообще не хочется. </IMHO>
Для железок с «отдельно стоящим» конфигом (свитчи, роутеры) команда может показать все ACL'ы, route maps, VPNы и проч секции конфига, что тоже удобно.
show run… |include <regexp> показывает только строки, в которых встречается regexp.
Структура конфига (вывода «чистого» show run) выглядит так (обратите внимание на отступы):
Нам нужны только заголовки секций — строки без отступов. Соответственно, нужны все строки, начинающиеся не с пробела. Но еще есть комментации и разделители секций в виде восклицательных знаков — они нам тоже не нужны. Получается, regexp должен выглядеть как «строки, начинающиеся не с пробела или восклицательного знака».
Воспользуемся конструкцией '[<XYZ>]', которая совпадает с любым символом, заключенным в квадратные скобки. [! ] даст нам «пробел или воскл знак», [^! ] даст нам «не пробел и не воскл знак». Добавим '^<X>' («строка начинается с X»): ^[^! ] = «строка начинается с любого символа кроме пробела или восклицательного знака».
Однако, зная, что название секции всегда буква — можно упростить regexp и сэкономитиь себе несколько секунд топтания по клаве: ^\\w. '\w' обозначает «любая буква» (заглавная и строчная), еще один бекслэш нужен для экранирования бекслэша в '\w' — получаем '\\w'. Добавляем «начало строки» — '^\\w'. Получается «покажи мне строки, которые начинаются с буквы».
P.S. Две страницы текста для описания одной строчки… o_O Как считаете, можно было без потерь обойтись одной-двумя строками?
Пишем:
RFS-ADSP>sh run | include ^\\w
Получаем:
version 2.1 ip access-list BROADCAST-MULTICAST-CONTROL ip access-list fw-acl-full ip access-list fw-acl-limited ip access-list fw-acl-verylimited mac access-list 12-block-mint mac access-list PERMIT-ARP-AND-IPv4 mac access-list l2-block-mint firewall-policy default firewall-policy lab-fw-wips role-policy lab-rolepol mint-policy global-default wlan-qos-policy default radio-qos-policy default aaa-policy lab-aaapol captive-portal lab-hotspot wlan ADSP-TRG wlan team6-eap wlan team6-hotspot wlan team6-psk1 wlan team6-psk2 smart-rf-policy lab-smartrf wips-policy lab-wips-basic advanced-wips-policy lab-wips-adv auto-provisioning-policy lab-autopolicy radius-group radgroup-fullusers radius-group radgrp-hotspot radius-user-pool-policy lab-radpool radius-server-policy lab-radius dhcp-server-policy ADSPLAB dhcp-server-policy RFS2 management-policy default management-policy lab-mgmt l2tpv3 policy default profile rfs4000 default-rfs4000 profile rfs4000 lab-rfs4000 profile ap71xx lab-7131 profile ap650 default-ap650 profile ap650 lab-ap650 profile ap6521 lab-6521 profile ap621 lab-621 rf-domain default rf-domain lab-rfdomain rfs4000 5C-0E-8B-1B-9B-44 ap650 5C-0E-8B-98-C5-44 ap6521 5C-0E-8B-E8-31-68 ap621 5C-0E-8B-97-C2-48 ap621 5C-0E-8B-97-DA-AA end
Для платформы WING5 эта команда весьма актуальна, т.к. контроллер держит мастер-конфигурацию для всей сети (а это могут быть сотни, если не тысячи секций для профилей/политик/устройств/сервисов и даже других контроллеров) — копаться в полном дампе running config нереально. <IMHO>Вообще, о том насколько круто реализована структура и синхронизация конфига в WING5 (распределенная сеть), и том, какие плюшки есть в CLI для массового конфигурирования/администрирования и траблшутинга можно писать отдельный цикл статей (типа запуска централизованного сбора пакетов со всех точек удаленного сайта командой в одну строчку). Возвращаться к сетям третьего поколения теперь вообще не хочется. </IMHO>
Для железок с «отдельно стоящим» конфигом (свитчи, роутеры) команда может показать все ACL'ы, route maps, VPNы и проч секции конфига, что тоже удобно.
Разбор regexp (на всякий случай, гуру могут пропускать)
show run… |include <regexp> показывает только строки, в которых встречается regexp.
Структура конфига (вывода «чистого» show run) выглядит так (обратите внимание на отступы):
! <заголовок> <версия> ! <секция X> <команда> <команда> .. ! <секция Y> <команда> <команда> .. ! ... ! <конец>
Нам нужны только заголовки секций — строки без отступов. Соответственно, нужны все строки, начинающиеся не с пробела. Но еще есть комментации и разделители секций в виде восклицательных знаков — они нам тоже не нужны. Получается, regexp должен выглядеть как «строки, начинающиеся не с пробела или восклицательного знака».
Воспользуемся конструкцией '[<XYZ>]', которая совпадает с любым символом, заключенным в квадратные скобки. [! ] даст нам «пробел или воскл знак», [^! ] даст нам «не пробел и не воскл знак». Добавим '^<X>' («строка начинается с X»): ^[^! ] = «строка начинается с любого символа кроме пробела или восклицательного знака».
Однако, зная, что название секции всегда буква — можно упростить regexp и сэкономитиь себе несколько секунд топтания по клаве: ^\\w. '\w' обозначает «любая буква» (заглавная и строчная), еще один бекслэш нужен для экранирования бекслэша в '\w' — получаем '\\w'. Добавляем «начало строки» — '^\\w'. Получается «покажи мне строки, которые начинаются с буквы».
P.S. Две страницы текста для описания одной строчки… o_O Как считаете, можно было без потерь обойтись одной-двумя строками?