脚本不将结果输出到文本文件

时间:2016-12-07 14:27:36

标签: regex perl ubuntu

所以我最近因各种原因开始使用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;
}

1 个答案:

答案 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