正则表达式匹配捕获和exp_send

时间:2012-12-13 22:10:32

标签: regex expect

目前我有一个脚本,它从下面的菜单响应中提取行#号,该响应具有我对“SalVhugoV3”感兴趣的SNMP用户。

这是蓝色的菜单响应

选择SNMP用户:   1)cmssnmp   2)地图集   3)SalVhugoV3 输入选项(1-3):

脚本的这个工作部分查找包含“SalVhugoV3”的字符串,并删除选项#3,因为它是用户正在寻找的选项。然后发送“3”作为“输入选择”提示的snmpuserChoice。

从列表/菜单中选择V3用户,grep为$ V3USER并发送它的号码

    expect -re ".*\\(.*\\):" {
    append rawOut $expect_out(buffer)
    regexp { .*(([0-9])\) [puts $V3USER].*) } $expect_out(buffer) cmdOut snmpUser snmpUserChoice
    exp_send -- "$snmpUserChoice\r"
}

我正在尝试做同样的事情,但是这个扩展的响应,因为你可以看到我在这种情况下寻找的用户选项是选项“5”,因为它包含“SalVhugoV3”的结尾字符串。我相信这是需要改变的“regexp {。(([0-9]))[put $ V3USER]。)}”但我不知道如何修改它以便它获取选项“5”号码,以便可以通过“exp_send”发送。

选择要删除的SNMP连接:   1)连接到NMS:主机135.9.60.143,端口162,用户cmssnmp   2)连接到SAL:主机135.9.158.252,端口162,用户cmssnmp   3)连接到SAL:主机135.9.158.236,端口162,用户cmssnmp   4)连接到NMS:主机135.105.6.67,端口162,用户地图集   5)连接到SAL:主机135.60.25.147,端口162,用户SalVhugoV3 输入选项(1-5):

从列表/菜单中选择V3用户,grep为$ V3USER并发送它的号码

    expect -re ".*\\(.*\\):" {
    append rawOut $expect_out(buffer)
    regexp { .*(([0-9])\) [puts $V3USER].*) } $expect_out(buffer) cmdOut snmpUser snmpUserChoice
    exp_send -- "$snmpUserChoice\r"
}

1 个答案:

答案 0 :(得分:0)

regexp "((\[0-9\])\\)\[^\\)\]*$V3USER)" $expect_out(buffer) cmdOut snmpUser snmpUserChoice

对于V3USER = atlas,它会给出:

  

snmpUser ='4)与NMS的连接:主机135.105.6.67,端口162,用户atlas'

     

snmpUserChoice = '4'

为了更好的可读性并避免转义:

set gen_expr {([0-9])\)[^\)]*}
set spec_expr "($choice_expr$V3USER)"
regexp $spec_expr $expect_out(buffer) cmdOut snmpUser snmpUserChoice
顺便说一句:术语{ ... [puts $V3USER] }让我感到困惑。在括号中没有转义,所以这只是被解释为正则表达式,因此期望其中一个字符'p','u','t','s','',$'等...