Greping通过NET:TELNET获得的数组

时间:2012-12-03 15:52:39

标签: perl telnet munin

我正在编写一个Munin-Pluging,我喜欢从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而不是过滤后的内容?
  • 我从net获得的数组:telnet与其他数组不同吗?

是的,我是Perl的新手。

1 个答案:

答案 0 :(得分: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;

打印变量是一个非常好的调试工具。