我正在编写一个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;
是的,我是Perl的新手。
答案 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;
打印变量是一个非常好的调试工具。