2012-12-13 125 views
1

目前我有一個腳本,它從下面的菜單響應中提取行號,它具有我對「SalVhugoV3」感興趣的SNMP用戶。regexp匹配捕獲和exp_send

以下是在藍色

菜單響應選擇一個SNMP用戶: 1)cmssnmp 2)圖譜 3)SalVhugoV3 輸入選擇(1-3):

的該工作部分腳本查找包含「SalVhugoV3」的字符串,並取走選項#3,因爲這是它正在查找的用戶的選項。然後發送「3」作爲「Enter choice」提示的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]))[放置$ 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 Enter choice 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" 
} 

回答

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

對於V3USER =圖譜它會給:

snmpUser = '4)連接到NMS:主機135.105.6.67,端口162,用戶圖譜'

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',''','',$'等之一...