Parsing expect_out using regex in expect script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Parsing expect_out using regex in expect script
# 1  
Old 12-16-2012
Parsing expect_out using regex in expect script

Hi,

I am trying to write an expect script. Being a newbie in expect, maybee this is a silly doubt but i am stuck here.

So essentially , i want the o/p of one router command to be captured . Its something like this

Code:
Stats

Input Rx   	: 1234
Input Bytes 	: 3456

My expect script looks something like this

Code:
  1 #!/usr/bin/expect -f
  2 set prompt {>}
  3 set timeout 20
  4 set user [lindex $argv 0]
  5 set password [lindex $argv 1]
  6 spawn su $user
  7 expect "Password:"
  8 send "$password\r";
  9 send -- "ls\r"
 10 expect $prompt
 11 puts "The output is $expect_out(buffer)"
 12
 13 interact


Now, i see the complete o/p by the last statement. Not able to get the correct syntax of -re for parsing the o/p. Just want to store the variables
Input Rx and input bytes.


Any help is really appreciated.

Thanks,
ashy_g

Last edited by Scott; 12-17-2012 at 03:54 PM.. Reason: Code tags
# 2  
Old 12-16-2012
Please always use code tags when posting any code fragments or data samples. If you are not sure how to use code tags, then please have a look at this forum video tutorial

Can you please post expect o/p and what exactly do you want to extract from expect o/p in code tags.
# 3  
Old 12-16-2012
Ok sure,

So the input values are somthing like this

Code:
# show traffic

--------------------------------------------------------------
                      Traffic Statistics
--------------------------------------------------------------
Packets Rx                   |               24644
alid Packets Rx              |               24644
Bytes                        |               99
Valid Byted                  |               45


and i want to write an expect script for login in the router, give the command to dislay these stats and then store them in the script variables to use them .

I am able to log-in the router and give the command but not able to use regex for parsing the expect_out buffer.

Any help is appreciated.

Thanks,
ashy_g

Last edited by Scott; 12-17-2012 at 03:53 PM.. Reason: ICODE tags ===> CODE tags
# 4  
Old 12-16-2012
Try somthing like this:

Code:
#!/usr/bin/expect -f
set prompt {>}
set timeout 20
set user [lindex $argv 0]
set password [lindex $argv 1]
spawn su $user
expect "Password:"
send "$password\r";
send -- "ls\r"
 
expect -re "tics\r\n# -*\r\n(.*)\r\n(.*)$prompt"
 
send "exit\r\n"
expect eof
 
set values $expect_out(1,string)
set found [regexp { \| ([0-9]+)\r\n.* \| ([0-9]+)\r\n.* \| ([0-9]+)\r\n.* \| ([0-9]+)} $values match px vpx by vby]
if {$found == 1} {
    puts "px is $px"
    puts "vpx is $vpx"
    puts "by is $by"
    puts "vby is $vby"
} else {
    puts "No match found!"
}

Edit:

Of course the above is very dependant on your exact output and you may be best off playing around with a testing script to get the matching just right. Below is the script I used to test my posted solution, and you can see even without the device/server in question I can throw together some regex strings that match what you see comming from the device:

Code:
#!/usr/bin/expect -f
set values "# Packets Rx | 24644
# alid Packets Rx | 24644
# # Bytes | 99
# # Valid Byted | 45"
set found [regexp { \| ([0-9]+).* \| ([0-9]+)\n.* \| ([0-9]+)\n.* \| ([0-9]+)} $values match px vpx by vby]
if {$found == 1} {
    puts "px is $px"
    puts "vpx is $vpx"
    puts "by is $by"
    puts "vby is $vby"
} else {
   puts "failed to match anything from\r\n$values"
}


Last edited by Chubler_XL; 12-16-2012 at 09:14 PM..
# 5  
Old 12-17-2012
Thanks for the reply Chubler_XL, but it still doesnot solve my problem

So, essentailly, my script now looks something like this
--------------------------------------------------------------
Code:
#!/usr/bin/expect
spawn su admin
expect "abc>"
send "en\r"
expect "abc#"
sleep 1
send "show traffic \r"
send " "


set values $expect_out(buffer)

set found [regexp { \| ([0-9]+)\r\n.* \| ([0-9]+)\r\n.* \| ([0-9]+)\r\n.* \| ([0-9]+)} $values match px vpx by vby]
if {$found == 1} {
    puts "px is $px"
    puts "vpx is $vpx"
    puts "by is $by"
    puts "vby is $vby"
} else {
    puts "No match found!"
}

interact

---------------------------------------------------------


And the output of the command , "show traffic" is

Code:
abc#show  traffic

[ SLOT : 1 ]
--------------------------------------------------------------
                      Traffic Statistics
--------------------------------------------------------------
Input  Packets Rx                             |               29262
Input Module Valid Packets Rx             |               29262
Rx Packets                               |                 104
Tx Packets                               |                   0

and my script does not store the variables correctly :-(

Thanks,
Ashish

Last edited by Franklin52; 12-17-2012 at 07:00 AM.. Reason: fixed code tags
# 6  
Old 12-17-2012
Try this one:

Code:
#!/usr/bin/expect
match_max 10000
set timeout 5
spawn su admin
expect "abc>"
send "en\r"
expect "abc#"
sleep 1
send "show traffic \r"
send " "
 
expect -re "tics\r\n---+\r\n(.*)\r\n(.*)abc#"
 
set values $expect_out(1,string)
set found [regexp { \| +([0-9]+)\r\n.* \| +([0-9]+)\r\n.* \| +([0-9]+)\r\n.* \| +([0-9]+)} $values match px vpx by vby]
if {$found == 1} {
    puts "px is $px"
    puts "vpx is $vpx"
    puts "by is $by"
    puts "vby is $vby"
} else {
    puts "No match found!\r\n$values"
}

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Help with understanding this regex in a Perl script parsing a 'complex' string

Hi, I need some guidance with understanding this Perl script below. I am not the author of the script and the author has not leave any documentation. I supposed it is meant to be 'easy' if you're a Perl or regex guru. I am having problem understanding what regex to use :confused: The script does... (3 Replies)
Discussion started by: newbie_01
3 Replies

2. Solaris

Help with parsing regex in tripwire

We have regex that we use to parse compliance policies in tripwire. can you please help to correct the regex : policy is "Verify That Exported File Systems Specify the ro (read-only) Option" the regex is ^.*-o+(?!ro+|ro\S+|\S+,ro\S+|\S+,ro+).*$ this does not work. how do we fix it ? ... (4 Replies)
Discussion started by: bathija12
4 Replies

3. Solaris

Help with parsing regex in tripwire for Solaris 10 dfstab FQDN

Help with parsing regex in tripwire: the rule is" This test verifies that all exported file systems found in /etc/exports specify a fully qualified domain name containing "thecss.com" or a NIS netgroup.." regex that does not work is : ... (1 Reply)
Discussion started by: bathija12
1 Replies

4. Solaris

Help with parsing regex in tripwire for Solaris 10 dfstab

Help with parsing regex in tripwire: the rule is" This test verifies that exported file systems do not have the "root=<host>" option specified." regex that does not work is : ^.*-o+(?=root=\S+|\S+,root=\S+).* the dfstab looks like this : # cat /etc/dfs/dfstab # Place... (1 Reply)
Discussion started by: bathija12
1 Replies

5. Shell Programming and Scripting

expect_out buffer no such variable running script background

I am trying to use send and receive using expect. the expect_out(buffer) is working fine while it is running it as foreground. But the same script when it is ran as background, the expect_out(buffer) errored out. Is there any factor influence when we run script in foreground and in background? ... (0 Replies)
Discussion started by: shellscripter
0 Replies

6. Shell Programming and Scripting

Expect and regex

I'm using Expect to execute a command on a router and return the output to a file. The output is a list. At the end of the list there's a statement that reads, "Found 165 active connections" (Where "165" could be any number between 0 and 2000.) I'm familiar with using Expect to return data from... (2 Replies)
Discussion started by: professorx
2 Replies

7. Shell Programming and Scripting

Need help with Expect script for Cisco IPS Sensors, Expect sleep and quoting

This Expect script provides expect with a list of IP addresses to Cisco IPS sensors and commands to configure Cisco IPS sensors. The user, password, IP addresses, prompt regex, etc. have been anonymized. In general this script will log into the sensors and send commands successfully but there are... (1 Reply)
Discussion started by: genewolfe
1 Replies

8. Shell Programming and Scripting

Help with expect expect_out

This is my simple expect scritpt: #!/usr/bin/expect -f match_max 100000 set timeout -1 spawn telnet $IP expect "#" send -- "shell\r" expect "*Ready*" send -- "init\r" expect "*Ready*" send -- "readsensor \r" expect -- "*" <<< Output of this is a 2 digit number set val... (5 Replies)
Discussion started by: expect_user
5 Replies

9. Shell Programming and Scripting

strange expect script behavior, or am i misunderstanding expect scripting?

Hello to all...this is my first post (so please go easy). :) I feel pretty solid at expect scripting, but I'm running into an issue that I'm not able to wrap my head around. I wrote a script that is a little advanced for logging into a remote Linux machine and changing text in a file using sed.... (2 Replies)
Discussion started by: v1k0d3n
2 Replies

10. Shell Programming and Scripting

Expect: Parsing/evaluating lines of numbers

There *has* to be an elegant way to do this in Expect... I have a command that returns lines of numbers. Like: prompt% mycommand --loop=5 9 4956 4951 4951 4956 9 4960 4951 4951 4956 9 4956 4951 4951 4956 9 4956 4951 4951 4956 9 4956 4951 4951 4956 prompt% All numbers must be... (0 Replies)
Discussion started by: kajkaj
0 Replies
Login or Register to Ask a Question