Estou tentando fazer com que meu script esperado reconheça um endereço IP usando regex. Pelo que sei, não consigo fazer nenhuma string regex funcionar.
Aqui está um trecho do meu código:
send "show router arp mac $MACADDR\r"
expect -re "^.\d+\.\d+\.\d+\.\d+.$"
puts "Carrying on....."
set IP_OUTPUT $expect_out(buffer)
puts $IP_OUTPUT
puts "Yay! That was success!!"
}
Eu tentei vários estilos de regex, mas todos parecem dar os mesmos resultados...nenhum.
O comando é executado conforme o esperado e retorna as informações necessárias, mas obtém expect
a próxima linha (o prompt para um novo comando)
Como eu espero $IP_OUTPUT
que seja
A::device.name# show router arp mac 00:00:00:00:00:00
===============================================================================
ARP Table (Router: Base)
===============================================================================
IP Address MAC Address Expiry Type Interface
-------------------------------------------------------------------------------
10.0.0.2 00:00:00:00:00:00 03h53m17s Dyn[I] Vlan799
===============================================================================
Mas tudo o que isso me dá é 'A:device.name#'
Strings entre aspas duplas passam por uma rodada de substituição antes de serem entregues ao comando. Portanto, você está solicitando que a saída corresponda exatamente a quatro sequências de um ou mais d's, com qualquer caractere entre e em ambos os lados, porque o regexp passado para o comando expect será "^.d+.d+.d+.d+. $".
Primeiro de tudo, você deve colocar seu padrão entre chaves para evitar essa rodada de substituição. Segundo, você quase nunca deseja ancorar padrões ao usar
expect
. Finalmente, não acho que você queira um caractere em ambos os lados do endereço IP.Isso pode ser mais como você deseja:
Se você realmente deseja obter o resultado mostrado, precisa de um padrão que corresponda até o final do relatório, caso contrário,
expect
poderá parar prematuramente. Nesse caso você pode ter que usar algo como: