コマンド出力を分割し、予想される単語を検索します。

コマンド出力を分割し、予想される単語を検索します。

このコードがあり、コマンドの出力を読み、最初から特殊文字まで部分文字列で囲み、セクションが空でない場合に渡されるログを送信したいと思います。しかし、どうすればいいのかわかりません。これまで私が得たものは次のとおりです。

#!/opt/tools/unsupported/expect-5.39/bin/expect

spawn ssh -l $USER $VMIP_1
expect_after eof {exit 0}
set timeout 10
match_max 256

expect "(yes/no)?" { send "yes\r" }
expect "password:" { send "$PASSWORD\r" }

expect "~]#" { send "date\r" }

expect "~]#" { send "pidof snmpd\r" }
sleep 5
expect "~]#" {
set buf [split $expect_out(buffer) "[root@"]
if {[lindex $buf 0] !=="" }
{
        log_file /home/bebehman/vnf/trunk/report.txt
                 send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Passed\n"
    } else { send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Failed\n"
    }
 }

ベストアンサー1

split思い通りにはならないので参考にしてください。単語に基づいて分割されず、2 番目の文字列に指定された文字に基づいて分割されます。たとえば、シーケンスが含まれていなくても2つの部分split "xax" "abc"に分けられます。xaxabc

たとえば、特定の部分文字列から文字列を分割する簡単な方法は、コマンドを使用して部分string first文字列の先頭を見つけ、string rangeその点にコピーすることです。

set str $expect_out(buffer)
set v [string range $str 0 [string first "\[root@" $str]-1]

vその後、空であることをテストできます。

または を実行する代わりにexpect "~]#"を実行するexpect "\[root@"と、$expect_out(buffer)抽出する内容がすでに含まれます。


以前のバージョンのtcl / expectでは、数値 - 数値形式を受け入れるのexprではなく、インデックスから1を引く必要があります。string rangeたとえば、次のようにします。

set v [string range $str 0 [expr [string first "\[root@" $str] - 1]]

おすすめ記事