원하는 언어를 실행하고 스크립트에서 출력을 grep/parse하려고 합니다. 출력을 grep하고 "오류"를 찾고 싶습니다. (awk, sed, grep 등과 같은 표준 Linux 명령은 원격 VPlexcli 시스템에서 사용할 수 없다는 점에 유의해야 합니다.)
#!/bin/bash
expect - << EOF
# connect to vplexcli
spawn vplexcli
# Look for login prompt
expect -re "Name:"
# Send login
send "service\r"
# Look for password prompt
expect -re "Password:"
# Send password
send "letmein123\r"
expect -re "VPlexcli:/> "
send "ll /clusters/cluster-1/storage-elements/\r"
expect -re "VPlexcli:/> "
send "exit\r"
EOF
출력은 다음과 같습니다.
VPD83T3:6006016036c02c00e217465c0516e211 ok APM00121002844.SPA APM00121002844.SPB both 0x002e000000000000 implicit-explicit
VPD83T3:6006016036c02c00e4dc0671f907e211 ok APM00121002844.SPA APM00121002844.SPB both 0x0010000000000000 implicit-explicit
VPD83T3:6006016036c02c00ec79619bdd08e211 error APM00121002844.SPA APM00121002844.SPB none implicit-explicit
VPD83T3:6006016036c02c00f0bfd3dedd08e211 error APM00121002844.SPA APM00121002844.SPB none implicit-explicit
답변1
출력을 캡처하고 예상 내에서 구문 분석할 수 있습니다.
#!/usr/bin/expect -f
# connect to vplexcli
spawn vplexcli
# Look for login prompt
expect -re "Name:"
# Send login
send "service\r"
# Look for password prompt
expect -re "Password:"
# Send password
send "letmein123\r"
expect -re "VPlexcli:/> "
send "ll /clusters/cluster-1/storage-elements/\r"
expect -re "(.*)VPlexcli:/> "
foreach line [split $expect_out(1,string) \n] {
if {[string match *error* $line]} {
puts $line
}
}
send "exit\r"
expect eof
답변2
이것이 당신이 원하는 것입니까?
#!/bin/bash
(expect - << EOF
...
EOF
) | while read line; do if [[ "$line" =~ "error" ]]; then echo $line; fi; done
당신이 grep을하지 않았다는 것에 놀랐습니다.