处理 Perl 脚本的输出

Processing the output from Perl script

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

我也试过在变量中传递正则表达式,但没有成功。

想法是将命令的所有输出打印到日志文件中,直到它到达以 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组组成。 "Current Active Rogue Devices" 之后是 "Known/Recognized Rogue Devices" 然后是 "User Blocked Rogue Devices:" 所有内容都相同: Rogue Devices: Mac Address= XXX Channel= XXX Radio= XXX Type= XXX Encryption= XXX SSID = XXX 最后检测到 = XXX

更新

你的问题很不清楚。你说

The idea is to print into a log file all of the output from the command until it reaches a line that starts with known

这个有用吗?

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


原版post

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

像这样

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

    ...
}

如上所述,您想使用 != 运算符。但是您也有错误的逻辑运算符 - 当您应该使用 'and' (&&).

时却使用了 'or' (||)

当您到达其中一条停止线时,您可以使用 last 退出循环。请注意,正则表达式区分大小写......如果你想不区分大小写,请将 i 标志添加到你的正则表达式的末尾:/regex/i.

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

    print "$index\n";
}

感谢@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;
    }

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