处理 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" 的行时停止。
使用此代码,日志文件中的结果始终是总输出。
我也试过在变量中传递正则表达式,但没有成功。
想法是将命令的所有输出打印到日志文件中,直到它到达以 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" 的行时停止。