所以我最近因各种原因开始使用Ubuntu
操作系统,我对系统中存在的系统日志感兴趣。
我创建了一个perl
脚本,可以在系统日志中搜索使用正则表达式在日志中存在的特定术语并将其打印出来,但不幸的是,当代码运行时没有任何错误,实际上没有打印出来。
我似乎无法弄清楚为什么它没有将搜索结果输出到输出文件。
到目前为止我得到了什么 任何帮助将不胜感激
#!/usr/bin/perl
use strict;
use warnings;
my @array=();
open(my $keyword,'<', "keyword.txt") or die "Couldn't open file file.txt, $!";
open(my $sys,'<', "syslog") or die "Couldn't open file file.txt, $!";
#open($keyword,'>' "keyword.txt") || die "Couldn't open file file.txt, $!";
#open my $keyword, '>' , $file_location3 or die "can't open Keywords:" $!; # gives keywords.txt the file handle keyword and shows
#error message if it fails to open
#open my $sys, '>' , $file_location2 or die $!; # same as above
open(my $fh, '>', 'output.txt');
#my $file_location2 = "syslog";
#my $file_location3 = "keyword.txt";
#arraylisy goes here
my $Keyword_or = join '|' , map {chomp;qr/\Q$_\E/} <$keyword>; # lists all lines in indicated file and joins the list in 1 string
#regex here removes new line from each line and uses literal regex
#which matches even those words with dots
my $regex = qr|\b($Keyword_or)\b|; # this regex will match
#all the keywords stored in keywords txt file
#@array = $Keyword_or;
foreach $regex(@array)
{
#while (/regex/g)
#{
#print $NEW "$.: $1";
print $fh $regex;
#}
#return $keyword;
#return $sys;
#return $NEW;
#print $fh $NEW;
close $fh;
}
整理并删除注释掉的行,Perl代码看起来像这样。非常可读但明显错误
use strict;
use warnings;
my @array = ();
open( my $keyword, '<', "keyword.txt" ) or die "Couldn't open file file.txt, $!";
open( my $sys, '<', "syslog" ) or die "Couldn't open file file.txt, $!";
open( my $fh, '>', 'output.txt' );
my $Keyword_or = join '|', map { chomp; qr/\Q$_\E/ } <$keyword>;
my $regex = qr|\b($Keyword_or)\b|;
foreach $regex ( @array ) {
print $fh $regex;
close $fh;
}
答案 0 :(得分:3)
有一些可能的问题。
"headerName.h"
,这意味着您只会打印一个结果。close $fh;
,所以它是空的。@array
可能没有按你的想法行事。它反复foreach $regex ( @array ) {
并依次将其分配给$regex
的每个值 - 它没有进行正则表达式匹配。 (也许你想要@array
?)也许你的意思是:
grep
注意 - regex的#!/usr/bin/env perl
use strict;
use warnings;
open( my $keyword, '<', "keyword.txt" )
or die "Couldn't open file file.txt, $!";
open( my $sys, '<', "syslog" ) or die "Couldn't open file file.txt, $!";
open( my $output, '>', 'output.txt' );
my $regex = join( '|', map { quotemeta s/[\r\n]+//r } <$keyword> );
$regex = qr/\b($regex)\b/;
select $output; #set standard output to this file
while (<$sys>) {
print if m/$regex/;
}
close($keyword);
close($sys);
close($output);
标志是perl 5.14的一个功能。这仍然很旧,但有旧版本的perl。如果需要,您可以通过以下方式解决此问题:
r