명령 출력을 분할하고 예상 단어를 검색합니다.

명령 출력을 분할하고 예상 단어를 검색합니다.

이 코드가 있고 명령의 출력을 읽고 처음부터 특수 문자까지 부분 문자열로 묶은 다음 섹션이 비어 있지 않으면 전달되는 로그를 보내길 원합니다. 하지만 어떻게 해야할지 모르겠습니다. 지금까지 내가 얻은 것은 다음과 같습니다.

#!/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생각대로 되지 않으니 참고하세요 . 단어를 기준으로 분할되지 않고 두 번째 문자열에 제공된 문자를 기준으로 분할됩니다. 예를 들어, 시퀀스가 ​​포함되어 있지 않더라도 두 부분 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]]

답변2

if {[lindex $buf 0] !=="" }
{

컴파일되지 않습니다. 대신 이것이 필요합니다.

if { [lindex $buf 0] != "" } {

관련 정보