您好我是Expect脚本新手,我一直在尝试使用以下内容将IP地址提取到变量中:
set timeout -1
spawn $env(SHELL)
match_max 100000
send "ifconfig | grep -A 1 'eth1' | tail -1\r "
expect -re "inet addr:.* " {send "ping $expect_out(0,string)\r"}
send -- "exit\r"
expect eof
问题是它正在尝试ping ifconfig命令的结果,该命令中包含一些字符串字符。
有人可以帮我从ifconfig命令中提取IP地址并将其存储在变量中吗?我一直在使用$ expect_out(缓冲区),但是我无法理解它。我们非常感谢您对这些方面的任何帮助。
答案 0 :(得分:4)
您不需要生成shell:
spawn ifconfig eth1
expect -re {inet addr:(\S+)}
set ipaddr $expect_out(1,string)
expect eof
spawn ping -c 10 $ipaddr
expect eof
实际上,你不需要使用Expect:在普通的Tcl中(对ping进行额外的错误检查):
if {[regexp {inet addr:(\S+)} [exec ifconfig eth1] -> ipaddr]} {
set status [catch [list exec ping -c 10 $ipaddr] output]
if {$status == 0} {
puts "no errors from ping: $output"
} else {
puts "ERROR: $output"
}
}
答案 1 :(得分:1)
您可以在现有代码上使用regexp:
expect -re "inet addr:.* " {
regexp {inet.*?(\d+\.\d+\.\d+\.\d+)} $expect_out(buffer) match ip
puts "Pinging $ip"
send "ping $ip\r"
}
在行中:
regexp {inet.*?(\d+\.\d+\.\d+\.\d+)} $expect_out(buffer) match ip
regexp命令正在一个括号内的“捕获组”中捕获ip地址:
(\d+\.\d+\.\d+\.\d+)
然后将其存储在变量ip
中。
expect_out(buffer)
变量是源字符串,包含到目前为止所读取的所有内容(直到您的expect -re
命令),而match
是另一个存储与整个匹配的字符串的变量正则表达式(从'inet'到ip地址结尾的所有内容。)match
只是符合regexp语法,要求在捕获组之前存在变量 - 在这个特定的例子中它是一次性数据 - regexp的重写版本可以使用match来存储此示例的ip,但一般来说我发现捕获组更灵活,因为你可以有几个从单个字符串中捕获不同的数据。
您可能希望阅读regexp命令和regular expressions,因为Expect广泛使用它们。
答案 2 :(得分:0)
将您的'发送"ifconfig | grep -A 1 'en1' | tail -1\r"
更改为如下所示。
send "ifconfig | grep -A 1 'en1' | tail -1 | cut -d' ' -f2\r"
答案 3 :(得分:0)
$ifconfig
eth0 Link encap:Ethernet HWaddr 00:1b:fc:72:84:12
inet addr:172.16.1.13 Bcast:172.16.1.255 Mask:255.255.255.0
inet6 addr: fe80::21b:fcff:fe72:8412/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:638661 errors:0 dropped:20 overruns:0 frame:0
TX packets:93858 errors:0 dropped:0 overruns:0 carrier:2
collisions:0 txqueuelen:1000
RX bytes:101655955 (101.6 MB) TX bytes:42802760 (42.8 MB)
Memory:dffc0000-e0000000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3796 errors:0 dropped:0 overruns:0 frame:0
TX packets:3796 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:517624 (517.6 KB) TX bytes:517624 (517.6 KB)
试试这个:
ifconfig | sed '2,2!d' | sed 's/.*addr://' | sed 's/\ .*//' > ipaddress
这将给ip
$vi ipaddress