在 Expect 脚本中识别 IP

问题描述 投票:0回答:1

我正在尝试让我的期望脚本使用正则表达式识别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:设备名称# '

tcl expect
1个回答
0
投票

双引号之间的字符串在传递给命令之前会经过一轮替换。因此,您要求输出完全匹配一个或多个 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}
© www.soinside.com 2019 - 2024. All rights reserved.