Questão enviando o comando GREP falha


Eu sou novo para esperar scripting e tentando fazer o script abaixo funcionar. O script loga em um servidor e lê um arquivo de configuração ($ val no script) para os valores de "cps" e então apresenta um valor total, mas ficou preso ao enviar um longo comando "grep" que eu dividi em 2 partes :

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}

A execução termina em:

exp_send "$cmd1 $val $cmd2\r"  

aqui apenas a primeira parte ($ cmd1 $ val) é executada, a segunda parte ($cmd2) envia como um comando separado e falha em "|" com mensagem: bash: syntax error near unexpected token |'

O comando grep` funciona bem se executado diretamente no Linux. Eu suponho que há um erro (sintaxe?) Na linha exp_send, mas não descobri como fazê-lo de uma maneira apropriada, com certeza há uma maneira melhor de fazê-lo. Este é o script atual:

#!/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


origem


O conteúdo de $val terminar com um \r? Você está lendo de um arquivo que tinha finais de linha do DOS? - glenn jackman
Oi Glenn, obrigado por tomar o tempo para responder, o valor de $ val é o nome de um arquivo de texto, por exemplo: ts1455_TrafficMix_ims.cfg o conteúdo desse arquivo está em texto simples. - Dalman


Respostas:


Eu acho que estou certo:

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

expect_out(0,string) irá conter toda a partida, não apenas o bit entre parênteses.

Experimentar:

set val $expect_out(1,string)

para selecionar apenas o que corresponde ao padrão em (o primeiro conjunto de) parênteses.


0