2012-12-03 62 views
1

我正在寫一個Munin-Pluging,我喜歡從telnet會話捕獲屏幕輸出。 這樣的會話的輸出如下所示:通過NET獲得一個數組grenets:TELNET

... 
    0x00017 0x41b3f340 BPING      0   0   0   0   198   132   330    
    0x00018 0x41b47340 CHKFAILED     0   0   0   0   198   132   330    
    0x00026 0x41b4f340 CIP       0   0   0   0   370   264   634    
    0x0001e 0x41b57340 CONTROL      0   1   0   0   3876   2178   6054    
    0x01014 0x41b5f340 UNETSRVR     0   0   0   1   296   198   494    
    0x00037 0x41b67340 ----      0   0   0   0   198   132   330    
    0x00000 0x43b67450 ----      0   0   0   0   0   0    0    
    0x00000 0x4bb67450 ----      0   0   0   0   5084   4224   9308    
    0x00000 0x49367450 ----      0   0   0   0   14742  4158   18900   
    ------------------------------------------------------------------------------------------- 
              SUMMARY : 2   40  5   7   4898229  2728176  7626405  

該腳本中提取的屏幕內容到一個數組(@lines)。

#!/usr/bin/perl 

use Net::Telnet(); 
use strict; 
use warnings; 


my $t = new Net::Telnet (Timeout => 10); 

$t->port(777); 
$t->open("192.168.0.1"); 

$t->buffer_empty; 
my @lines = $t->waitfor(match =>"m/.* SUMMARY : .* \n/"); 

my @gagu = grep { "$_" =~ /^.*BPING.*\n/ } @lines; 

print @gagu; 
  • 什麼類型的是數組@lines?
  • 爲什麼我總是從grep獲取整個 內容而不是過濾的行?
  • 是我從網絡獲得的數組:telnet不同於其他數組?

是的,我是新來的Perl。

+0

在perl中沒有數組是不同的,它們只是包含不同的東西。如果您想查看數據中的內容,請使用['Data :: Dumper'](http://search.cpan.org/perldoc?Data%3A%3ADumper)模塊。 – TLP

+1

我使用txt文件提供的輸入測試了腳本。它按照你的預期工作。請用Data :: Dumper檢查你的線陣列。 – Demnogonis

回答

1

我不熟悉這個模塊,它做了什麼,但我認爲它給了你一些類似於你所說的返回值。

如果您正在獲取@gagu陣列中的所有行,可能是@lines陣列中的數據只包含一行,或者grep失敗。

例如,@lines可能包含字符串:

"foo bar baz\nfoo1 bar1 baz1\n"; 

,而不是像你期望

"foo bar baz\n"; 
"foo1 bar1 baz1\n"; 

你grep的聲明可能按預期工作,雖然你可能要考慮:

  • 未引用$_,因爲這沒有用處。
  • 完全不使用$_,因爲這是默認變量,它不是必需的(除了清晰)使用它。
  • 未使用錨點^\n,因爲它們是多餘的。

例如,^.*匹配任何地方的任何字符串。用它來簡單地匹配一個字符串是多餘的。用.*\n結束正則表達式是多餘的,因爲它所說的只是「匹配除了換行符之外的任何字符,直到找到換行符爲止」。假設你有換行符,它什麼都不做。假設你沒有,它會給你一個錯誤的否定。所有你需要這場比賽是/BPING/。因此,這裏是你的代碼是什麼樣子:

use Data::Dumper; 
my @lines = $t->waitfor(match =>"m/ SUMMARY :/"); 
my @gagu = grep /BPING/, @lines; 

print Dumper \@gagu; 

如果你想看到的空白打印出明顯的是,你可以使用$Data::Dumper::Useqq變量:

$Data::Dumper::Useqq = 1; 
print Dumper \@gagu; 

打印變量是一個很好的調試工具。