отправка команды GREP не удалась

710
Dalman

Я новичок в ожидании сценариев и пытаюсь заставить работать сценарий ниже. Сценарий входит на сервер и читает файл конфигурации ($ val в сценарии) для значений «cps», а затем представляет общее значение, но застрял при отправке длинной команды «grep», которую я разделил на 2 части. :

set cmd1 "grep -A200 \"_ims\""   set cmd2 { | grep -B3 "calledUserDescriptor" | grep "cps" | grep -v "//cps" | awk '{ SUM += $3} END { print "total sip cps = "SUM}' >> cps.txt} 

Исполнение останавливается на:

exp_send "$cmd1 $val $cmd2\r" 

здесь выполняется только 1-я часть ($ cmd1 $ val), 2-я часть ( $cmd2) отправляется как отдельная команда и завершается с ошибкой в ​​«|» с сообщением:bash: syntax error near unexpected token |'

Команда grep` работает нормально, если выполняется непосредственно в Linux. Я полагаю, что в строке exp_send есть ошибка (синтаксис?), Но мы не выяснили, как это сделать надлежащим образом, наверняка есть лучший способ сделать это. Это фактический скрипт:

#!/usr/bin/expect -f  set lnk1 "Traffic_ims.cfg"  set cmd1 "grep -A200 \"_ims\""  set cmd2 { | grep -B3 "calledUserDescriptor" | grep "cps" | grep -v "//cps" | awk '{ SUM += $3} END { print "total sip cps = "SUM}' >> cps.txt}   set file1 "/tmp/cps.txt"  set cmd3 "cd /home/traffic/"  set cmd4 "readlink"  set passwd "xxxxx"  log_user 1  spawn rm -rf $file1  spawn ssh user@192.24.135.166  expect {  -re ".*Are.*.*yes.*no.*" {  send "yes\n"  exp_continue  }  "*?assword:*" {  send $passwd  send "\n"  }  }  expect "*\$ "  exp_send "$cmd3\r"  expect "$cmd3\r"  expect -re $  exp_send "$cmd4 $lnk1\r"  expect "$cmd4 $lnk1\r"  expect -re "(Titan.*)\r"  set val $expect_out(0,string)   exp_send "$cmd1 $val $cmd2\r"  expect -re "(.*)\r"  set output [open "/tmp/cps.txt" "a+"]  set outcome $expect_out(buffer)  send "\r"  puts $output $outcome  close $output   exp_send "exit \r"  exit 0  
1
Содержимое `$ val` заканчивается на` \ r`? Вы читаете из файла с окончанием строки DOS? glenn jackman 9 лет назад 0
Привет, Гленн, спасибо, что нашли время ответить, значение $ val - это имя текстового файла, например: ts1455_TrafficMix_ims.cfg, содержимое этого файла в виде простого текста. Dalman 9 лет назад 0

1 ответ на вопрос

0
glenn jackman

I think I'm right:

expect -re "(Titan.*)\r" set val $expect_out(0,string) 

expect_out(0,string) will contain the whole match, not just the bit in parentheses.

Try:

set val $expect_out(1,string) 

to only select what matched the pattern in (the first set of) parentheses.

Похожие вопросы