11 de jan. de 2010

"Dê um show" com Expressões Regulares no IOS !

Como o próprio título sugere, podemos usar expressões regulares, tão comuns no Linux e outros dialetos Unix, para turbinar nossos comandos no IOS e especificar EXATAMENTE a que string de texto queremos nos referir dentro da configuração de um roteador Cisco.

Mãos a obra:

Uso do circunflexo --> "^"
Use este caracter para pesquisar o inicio de uma string.

Por exemplo: ^123 nos traz 1234, mas não 01234 ou 91234

Na saida abaixo, todas as ocorrências da string IP do arquivo running-config são exibidas:

Router#show run | include ip
ip cef
no ip dhcp use vrf connected
ip dhcp pool ITS
option 150 ip 10.1.1.1
no ip domain lookup
voice service voip
allow-connections h323 to sip
allow-connections sip to h323
allow-connections sip to sip
ip address 192.168.10.1 255.255.255.0
ip address 192.168.11.1 255.255.255.0
ip address 192.168.12.1 255.255.255.0
ip address 192.168.13.1 255.255.255.0
ip address 192.168.14.1 255.255.255.0

Contudo, ao acrescentar o carater ^ temos a seguinte saida:

Router#show run | include ^ip
ip cef
ip dhcp pool ITS
ip http server

Somente as linhas que começam com "ip" serão exibidas


Uso do Cifrão --> "$"
Use este caracter para especificar o texto no final de uma string:

Por exemplo 123$ nos traz 0123, mas não 1234

Observe a saida do comando abaixo sem nenhuma expressão regular:

Router#show run | include 1
Current configuration : 5174 bytes
! Last configuration change at 15:27:21 UTC Wed Jan 24 2007
! NVRAM config last updated at 14:25:01 UTC Wed Jan 24 2007
version 12.4
network 10.1.1.0 255.255.255.0
option 150 ip 10.1.1.1
default-router 10.1.1.1
source-address 10.1.1.1 port 5060
create profile sync 0002381328447096
voice register dn 1
number 1100
number 1101
voice register pool 1
id mac 0003.6B8B.174A
number 1 dn 1
codec g711ulaw
ip address 192.168.10.1 255.255.255.0
interface Loopback1
ip address 192.168.11.1 255.255.255.0
ip address 192.168.12.1 255.255.255.0
ip address 192.168.13.1 255.255.255.0

Qualquer linha que contenha o numero 1 em qualquer posição é exibida, mas se nós mudarmos a linha de comando para:

Router#show run | include 1$
voice register dn 1
number 1101
voice register pool 1
number 1 dn 1
interface Loopback1
interface Loopback11
interface Loopback21
interface FastEthernet0/1
session target ipv4:10.1.1.1
session target ipv4:10.1.1.11
session target ipv4:10.1.1.21
session target ipv4:10.1.1.31
session target ipv4:10.1.1.41
session target ipv4:10.1.1.51
session target ipv4:10.1.1.61
number 1001
ephone 1
button 1:1

Apenas as linhas que terminam com 1 serão selecionadas.


Uso do Ponto --> "."

O "." significa qualquer caracter numa dada posição

Por exemplo:
0.0 nos traz 0x0 e 020
t..t nos traz strings como test, text e tart

No roteador, vamos pesquisar por todas as linhas que terminam com 0 (zero) e um outro caracter qualquer:

Router#sh run | include 0.$
! Last configuration change at 15:27:21 UTC Wed Jan 24 2007
! NVRAM config last updated at 14:25:01 UTC Wed Jan 24 2007
load 7960-7940 P0S3-07-4-00
number 1100
number 1101
clock rate 2000000
destination-pattern 1000
load 7910 P00405000700
ip source-address 10.1.1.1 port 2000
number 1000
number 1001
scheduler allocate 20000 1000

Todas as linhas acima terminam com zero e um outro caracter qualquer.

Uso do Underscore --> " _"

Substitui uma longa expressão regular combinando com uma virgula, abre chaves, fecha chaves, o começo de uma string, o fim de uma string ou um espaço.


Por exemplo, a expressão _1300_ pode combinar com as seguintes strings:

^1300$

^1300space

space1300

{1300,

,1300,

{1300}

,1300,

No exemplo abaixo estamos pesquisando por todas as loopbacks com o numero 2:

Router#show ip route | include k2
C 192.168.12.0/24 is directly connected, Loopback2
C 192.168.31.0/24 is directly connected, Loopback21
C 192.168.30.0/24 is directly connected, Loopback20
C 192.168.32.0/24 is directly connected, Loopback22

Entretanto, se usarmos o caracter "_" teremos:

Router#show ip route | include k2_
C 192.168.12.0/24 is directly connected, Loopback2

Apenas a interface Loopback2 (sem nada a direita) será exibida


Uso dos Colchetes --> "[ ]"

Vc pode especificar uma faixa de caracteres aceitáveis dos colchetes.

Por exemplo:
[A-Z] se refere a qualquer letra maiuscula do alfabeto, mas não se refere a caracteres minúsculos nem a números

Em um roteador podemos usar o seguinte comando:

Router#show ip route | include k[1-9]
C 192.168.12.0/24 is directly connected, Loopback2
C 192.168.29.0/24 is directly connected, Loopback19
C 192.168.28.0/24 is directly connected, Loopback18
C 192.168.13.0/24 is directly connected, Loopback3
C 192.168.14.0/24 is directly connected, Loopback4
C 192.168.31.0/24 is directly connected, Loopback21
C 192.168.30.0/24 is directly connected, Loopback20
C 192.168.15.0/24 is directly connected, Loopback5
C 192.168.25.0/24 is directly connected, Loopback15
C 192.168.24.0/24 is directly connected, Loopback14
C 192.168.27.0/24 is directly connected, Loopback17
C 192.168.26.0/24 is directly connected, Loopback16
C 192.168.11.0/24 is directly connected, Loopback1
C 192.168.21.0/24 is directly connected, Loopback11
C 192.168.20.0/24 is directly connected, Loopback10
C 192.168.23.0/24 is directly connected, Loopback13
C 192.168.22.0/24 is directly connected, Loopback12
C 192.168.17.0/24 is directly connected, Loopback7
C 192.168.16.0/24 is directly connected, Loopback6
C 192.168.19.0/24 is directly connected, Loopback9
C 192.168.32.0/24 is directly connected, Loopback22
C 192.168.18.0/24 is directly connected, Loopback8

Contudo, se nós acrescentarmos a esta saída o caracter "_" :

Router#show ip route | include k[1-9]_
C 192.168.12.0/24 is directly connected, Loopback2
C 192.168.13.0/24 is directly connected, Loopback3
C 192.168.14.0/24 is directly connected, Loopback4
C 192.168.15.0/24 is directly connected, Loopback5
C 192.168.11.0/24 is directly connected, Loopback1
C 192.168.17.0/24 is directly connected, Loopback7
C 192.168.16.0/24 is directly connected, Loopback6
C 192.168.19.0/24 is directly connected, Loopback9
C 192.168.18.0/24 is directly connected, Loopback8


Uso do Pipe --> "|"

O pipe representa o operador lógico "ou". Por exemplo:

A(B|C)D combina com ABD e ACD, mas não AD, ABCD, ABBD, ou ACCD

Se vc quiser visualizar todas as rotas que contenham os números 10 ou 20 teremos:

Router#show ip route | include 10|20
C 192.168.10.0/24 is directly connected, Loopback0
C 192.168.20.0/24 is directly connected, Loopback10


Uso da Barra Invertida --> "\"

Use este simbolo numa expressão regular para definir que o próximo caracter não será usado como coringa na expressão regular, ou seja, é um caracter comum

Por exemplo:

Router#show running-config | include 10..

Traz como resultado:

network 10.1.1.0 255.255.255.0
option 150 ip 10.1.1.1
default-router 10.1.1.1
source-address 10.1.1.1 port 5060
ip address 10.1.1.1 255.255.255.0
destination-pattern 10..
session target ipv4:10.1.1.1
session target ipv4:10.1.1.6
session target ipv4:10.1.1.11
session target ipv4:10.1.1.16
session target ipv4:10.1.1.21
session target ipv4:10.1.1.26
session target ipv4:10.1.1.31
session target ipv4:10.1.1.36
session target ipv4:10.1.1.41
dial-peer voice 10 voip
session target ipv4:10.1.1.46
session target ipv4:10.1.1.51
session target ipv4:10.1.1.56
session target ipv4:10.1.1.61
session target ipv4:10.1.1.66
registrar ipv4:10.1.1.1 expires 60
load 7910 P00405000700
--More--

Traz todas as linhas que contém o numero 10 seguido por 2 caracteres quaisquer em qualquer posição da linha. Observe o próximo exemplo:

Router#show running-config | include 10..$

O resultado será exibir todas as linhas que terminam com 10 + 2 caracteres quaisquer:

destination-pattern 10..
number 1000
number 1001
scheduler allocate 20000 1000

Com o uso da barra invertida, podemos especificar uma única linha:

Router#show running-config include 10\.\.

O resultado será:

destination-pattern 10..

Veja um outro exemplo:

Router#sh ip route | include \.20|\.10

O resultado será trazer qualquer linha que tenha um ponto seguido por 20 ou seguido por 10 :

C 192.168.10.0/24 is directly connected, Loopback0
C 192.168.20.0/24 is directly connected, Loopback10

Uso da Interrogação --> "?"
Representa zero ou qualquer ocorrência de um padrão de caracteres. (Lembre-se de usar Ctrl-V antes da interrogação para evitar que ele seja interpretado como o comando help.)

Exemplo: ba?b combina com bb e bab

Router>show ip route | include 25?5

B 216.221.5.0/24 [20/2954] via 208.51.134.254, 1w1d <=== 25
B 210.51.225.0/24 [20/0] via 203.62.252.186, 2w3d
B 204.255.51.0/24 [20/4294967294] via 144.228.241.81, 3w5d <== 255
B 203.34.233.0/24 [20/0] via 203.62.252.186, 3w5d
B 192.68.132.0/24 [20/0] via 216.218.252.145, 3w5d
B 222.35.252.0/24 [20/559] via 64.125.0.137, 1w0d
B 212.205.24.0/24 [20/7549] via 64.125.0.137, 2d05h
B 212.103.178.0/24 [20/0] via 216.218.252.145, 2w3d
B 209.50.226.0/24 [20/124] via 64.125.0.137, 3w5d
B 208.50.227.0/24 [20/3107] via 208.51.134.254, 1d22h
B 203.254.52.0/24 [20/0] via 213.140.32.146, 1w1d
B 203.1.203.0/24 [20/0] via 203.62.252.186, 3d03h
B 202.171.96.0/24 [20/361] via 129.250.0.11, 5d19h
Uso do +

Requer a ocorrência de uma ou mais vezes do caracter precedido pelo sinal de +. Por exemplo:
5+ exige que haja pelo menos um numero cinco na sequência pesquisada

No exemplo abaixo, estamos procurando por linhas contendo zero seguido por um ou mais zeros:

Router#sh run | i 00+
load 7960-7940 P0S3-07-4-00
create profile sync 0002381328447097
number 1100
id mac 0003.6B8B.174A
clock rate 2000000
tftp-server flash:P0S3-07-4-00.bin
tftp-server flash:P003-07-4-00.bin
tftp-server flash:P0S3-07-4-00.loads
tftp-server flash:P003-07-4-00.sbn
tftp-server flash:P0S3-07-4-00.sb2
tftp-server flash:P00405000700.bin
tftp-server flash:P00405000700.sbn
tftp-server flash:P0030702T023.bin
tftp-server flash:P0030702T023.loads
tftp-server flash:P0030702T023.sb2
tftp-server flash:P0030702T023.sbn
load 7910 P00405000700
load 7960-7940 P0030702T023
ip source-address 10.1.1.1 port 2000
create cnf-files version-stamp 7960 Jan 28 2007 14:22:09
number 1000
number 1001


Uso dos Parênteses --> "()"

Podemos criar expressões mais complexas combinando os caracteres anteriores dentro de parenteses: Exemplo: Mostrar todas as linhas que contenham um caracter maiusculo ou minusculo precedido de um número qualquer, com pelo menos uma ocorrência deste padrão:

Router#sh run | i ([A-Za-z][0-9])+

allow-connections h323 to sip
allow-connections sip to h323
load 7960-7940 P0S3-07-4-00
id mac 0003.6B8B.174A
codec g711ulaw
interface Loopback0
interface Loopback1
interface Loopback2
interface Loopback3
interface Loopback4
interface Loopback5
interface Loopback6
interface Loopback7
interface Loopback8
interface Loopback9
interface Loopback10
interface Loopback11
interface Loopback12
interface Loopback13
interface Loopback14
interface Loopback15

Uso do Asterisco --> "*"

Combina com zero ou mais sequëncias de um caracter precedido do asterisco. Por exemplo: 0* combina com qualquer ocorrência de o, inclusive nenhuma

10\..* combina com com 10. e qualquer conjunto de caracteres seguidos.

Router#sh run | i 10\..*

network 10.1.1.0 255.255.255.0
option 150 ip 10.1.1.1
default-router 10.1.1.1
source-address 10.1.1.1 port 5060
ip address 192.168.10.1 255.255.255.0
ip address 10.1.1.1 255.255.255.0
destination-pattern 10..
session target ipv4:10.1.1.1
session target ipv4:10.1.1.6
session target ipv4:10.1.1.11
session target ipv4:10.1.1.16
session target ipv4:10.1.1.21
session target ipv4:10.1.1.26
session target ipv4:10.1.1.31
session target ipv4:10.1.1.36
session target ipv4:10.1.1.41
session target ipv4:10.1.1.46
session target ipv4:10.1.1.51
session target ipv4:10.1.1.56
session target ipv4:10.1.1.61
session target ipv4:10.1.1.66

Bom, agora o único limite é sua imaginação. O que está esperando ? Crie suas próprias Expressões Regulares !!!


Referência:
http://www.configureterminal.com/newsletters/2.html

7 comentários:

  1. Sempre achei que o IOS fosse um *nix mascarado hehe =P

    ResponderExcluir
  2. Opa! Muito legal o post! Porém, conforme a referência, na parte do "_", ele faz um match com os seguintes caracteres: "comma (,), left brace ({), right brace (}), the beginning of the input string (^), the end of the input string ($), or a space", não com qualquer caracter.

    ResponderExcluir
  3. Oi Leandro,

    Vc tem toda razão, vou editar o Post.

    Outra coisa que eu acho importante frisar é que as Expressões regulares tem diversas aplicações no IOS como em Access-Lists para BGP e muito mais.

    Dêem uma olhada em:
    http://www.cisco.com/en/US/docs/ios/12_2/termserv/configuration/guide/tcfaapre_ps1835_TSD_Products_Configuration_Guide_Chapter.html#wp1026633

    Abs,

    ResponderExcluir
  4. Gostei do POST, muito bacana. São informações uteis para o dia-a-dia.
    Abraços
    Cassio Gomes

    ResponderExcluir
  5. Adilson,

    recentemente eu fiz um tutorial também de REGEX, porém não encontrei como fazer no IOS algo como no linux ficaria como:

    show ip route | grep 'x' | grep -v 'y'

    ...com o intuito de incluir algo, e excluir, após o primeiro match, outra regex.

    se souber como se faz isso, ficaria muito grato!

    abraços!

    ResponderExcluir
  6. Boss,

    Dei uma olhada no www.cisco.com e na sintaxe do comando show e constatei algo interessante. No pix/ASA e em routers com módulo de Firewall esta é a sintaxe que encontrei:

    hostname# show command | {include | exclude | begin | grep [-v]} regexp

    Na sintaxe acima há o parâmetro grep, mas, no GNS3 num router 3600 eis a sintaxe:

    Router#sh running-config | ?
    append Append redirected output to URL (URLs supporting append operation
    only)
    begin Begin with the line that matches
    exclude Exclude lines that match
    include Include lines that match
    redirect Redirect output to URL
    section Filter a section of output
    tee Copy output to URL

    Sem o parâmetro grep, tentei combinar include x com exclude y na mesma linha mas não funciona.

    Acho que vc só vai conseguir isso no IOS do Pix/ASA e em routers com o módulo de Firewall mesmo.

    Abs,

    ResponderExcluir
  7. Olá Adilson,

    tudo bem, ao menos agora eu acho que posso dizer que é limitação do IOS e não da minha pequena cabeça...hehehe

    abraços e obrigado pela ajuda!

    ResponderExcluir