我正在尝试让我的期望脚本使用正则表达式识别IP地址。据我所知,我无法让任何正则表达式字符串起作用。
这是我的代码片段:
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!!"
}
我尝试了多种正则表达式样式,但它们似乎都给出了相同的结果......没有。
命令按预期执行并返回所需的信息,但
expect
获取下一行(新命令的提示)
我期望
$IP_OUTPUT
看起来像什么
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
===============================================================================
但它给我的只是 'A:设备名称# '
双引号之间的字符串在传递给命令之前会经过一轮替换。因此,您要求输出完全匹配一个或多个 d 的四个序列,中间和两侧都有任何字符,因为传递给 Expect 命令的正则表达式将是“^.d+.d+.d+.d+”。 $”。
首先,您应该将模式放在大括号内以防止这一轮替换。其次,在使用
expect
时,您几乎不想锚定模式。最后,我认为您不希望 IP 地址两侧都有字符。
这可能更像你想要的:
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!!"
}
如果您确实想获得所显示的输出,则需要一个一直匹配到报告末尾的模式,因为否则
expect
可能会过早停止。在这种情况下,你可能必须使用类似的东西:
expect -re {.*\d+\.\d+\.\d+\.\d+.*=\n}