1

我正在写一个 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 的新手。

4

1 回答 1

1

我不熟悉这个模块以及它的作用,但我认为它会给你一些类似于你所说的返回值。

如果您正在获取@gagu数组中的所有行,则可能是@lines数组中的数据仅包含一行,或者grep失败。

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

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

而不是,如你所料

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

您的 grep 语句可能按预期工作,但您可能需要考虑:

  • 不引用$_,因为那没有任何意义。
  • 根本不使用$_,因为这是默认变量,因此不需要(为了清楚起见)使用它。
  • 不使用锚点^and \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;

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

于 2012-12-03T16:15:32.777 回答