处理Perl脚本的输出

时间:2015-12-14 16:51:45

标签: regex perl telnet

使用此代码,日志文件中的结果始终是总输出。

我也尝试在变量中传递正则表达式,但没有运气。

我们的想法是将命令的所有输出打印到日志文件中,直到它到达以known开头的行。

请分享您的想法或您认为正确的方法。

use strict;
use warnings;

use Net::Telnet;

my $telnet = new Net::Telnet( Timeout => 10, Errmode => 'die' );
my $logfile = 'Rogues.log';
my @hosts;
my $debug = 1;

$hosts[0] = 'xxx.xxx.xxx.xxx';

$telnet->open( "$hosts[0]" ) or die $telnet->errmsg;

$telnet->waitfor( '/Please login: $/i' );
$telnet->print( 'USERHERE' ) or die $telnet->errmsg;

$telnet->waitfor( '/Password: $/i' );
$telnet->print( 'PASSWORDHERE' ) or die $telnet->errmsg;

$telnet->waitfor( '/XXXX>/' );
$telnet->cmd( 'enable' ) or die $telnet->errmsg;

my @output = $telnet->cmd( 'show rogue-devices' ) or die $telnet->errmsg;

$telnet->close();

foreach my $index ( @output ) {

    if ( ( $index ne /^Known\/Recognized\sRogue\sDevices:/ )
            || ( $index ne /^User\sBlocked\sRogue\sDevices:/ ) ) {

        if ( $debug ) { }

        open( my $fh, '>>', 'ZD_Rogues.log' ) or die "Could not open file $logfile $!";
        print $fh "\n $index";
        close $fh;
    }
}

print "Export Finished. $logfile";

更新

嗨,输出由3组组成。 “当前活跃的流氓设备”后跟“已知/识别的恶意设备”,然后是“用户阻止的恶意设备:”,所有内容都相同:恶意设备:Mac地址= XXX频道= XXX广播= XXX类型= XXX加密= XXX SSID = XXX上次检测到= XXX

4 个答案:

答案 0 :(得分:1)

更新

你的问题很不清楚。你说

  

我们的想法是将命令的所有输出打印到日志文件中,直到它到达以已知

开头的行。

这有用吗?

for ( @output ) {
    last if /^known/i;
    print;
}


原帖

您正在使用字符串不等运算符ne而不是模式绑定运算符!~

喜欢这样

if ( $index !~ /^Known\/Recognized\sRogue\sDevices:/
        or $index !~ /^User\sBlocked\sRogue\sDevices:/ ) {

    ...
}

答案 1 :(得分:0)

如上所述,您想使用!=运算符。但是你也有错误的逻辑运算符 - 当你使用'和'(&&)时你正在使用'或'(||)。

答案 2 :(得分:0)

You can exit the loop using last when you reach one of your stop lines. Note that regexes match case-sensitively... if you want to be case-insensitive, add the i flag to the end of your regex: /regex/i.

for my $index (@output) {
    last if $index =~ /^Known\/Recognized Rogue Devices/
         || $index =~ /^User Blocked Rogue Devices/;

    print "$index\n";
}

答案 3 :(得分:0)

感谢@Borodin,@ stevieb,@ Ken Slater和@toolic,感谢您的反馈和时间。 如果我一开始也没有正确解释自己,我道歉。

    for my $index (@output) {
      open (my $fh, '>>', 'ZD_Rogues.log') or die "Could not open file $logfile $!";
      last if $index =~ /Known/;
      print $fh "\n $index";
      close $fh;
    }

上面的结果确实是,所有行都在导出到日志文件时停止,当它到达"已知"的行时。