0

在数组中有一些输出,我试图从输出以特定单词开始并以特定单词/字符结尾的位置提取详细信息。然后将该输出打印到屏幕上。

我正在使用的数组中的输出是:

router rip
 version 2
 redistribute bgp 45134 metric 3
 passive-interface Serial1/3:1.333
 passive-interface Serial3/1:3.333
 passive-interface Serial3/1:5.333
 passive-interface Serial3/2:1.333
 passive-interface Serial3/4:1.333
 passive-interface Serial3/4:17.333
 passive-interface Serial6/1:1.333
 no auto-summary
 !
 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

到目前为止,我生成的 perl 代码如下:

    elsif ( $action eq "show_vrf1" ) {
            my $cmd = "show run | begin router rip";
            my @lines = $s->cmd(String => $cmd,
                            Prompt  => "/$enableprompt/",
                            Timeout => 10);
            foreach my $line (@lines) {
                if(/address-family ipv4 vrf TestVRF-0001.*?!/){
                $result=$1;
                print $result;
                }
            }
    }

我只想将以下内容从数组中拉出:

 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

出于某种原因,当我运行脚本时,我只是得到一个空白屏幕,没有从数组中提取任何数据。

4

2 回答 2

1
                if($line =~ /address-family ipv4 vrf TestVRF-0001.*?!/){

代替

                if(/address-family ipv4 vrf TestVRF-0001.*?!/){

?

于 2013-07-22T09:41:47.330 回答
0

您将 $line 与正则表达式匹配。您期望的输出不在一行上,因此没有一行可以匹配它。

您可以将整个多行字符串存储在标量中:

my $output = join q(), $s->cmd(...);

然后,您可以检索输出,如果您使用括号来真正捕获字符串的一部分:

if ($output =~ /(address-family ipv4 vrf TestVRF-0001.*?!)/s) {
    my $result = $1;

请注意,/s需要修饰符才能使点匹配换行符,而通常不会。

于 2013-07-22T09:44:32.353 回答