尝试使用perl将日志文件推送到数组并处理这些文件

尝试使用perl将日志文件推送到数组并处理这些文件,perl,Perl,示例日志文件如下所示 /home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170410 /home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170303 /home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170406 /home/ajoy/alert-dc/testlogs/host1011/harvester

示例日志文件如下所示

/home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170410   
/home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170303   
/home/ajoy/alert-dc/testlogs/host1013/harvester.log.20170406   
/home/ajoy/alert-dc/testlogs/host1011/harvester.log.20170307   
/home/ajoy/alert-dc/testlogs/host1011/harvester.log.20170306   
/home/ajoy/alert-dc/testlogs/host1012/harvester.log.20170405   
/home/ajoy/alert-dc/testlogs/host1011/harvester.log.20170304   
/home/ajoy/alert-dc/testlogs/host1014/harvester.log.20170305   
/home/ajoy/alert-dc/testlogs/host1011/harvester.log.20170410   
/home/ajoy/alert-dc/testlogs/host1011/harvester.log.20170303 
正在尝试将今天的日志文件推送到阵列。但它不会产生任何输出或错误

其思想是将今天的日志加载到数组中,并处理每个文件以搜索“错误”,如果有错误,则提供输出文件名、文件路径和错误(下面的示例)


您的代码中只有一个小错误,请在选择
$模式之前先选择
$日期

chomp($Date);
my $pattern = qr/harvester\.log\.$Date/;
my $pattern = qr/harvester\.log\.$Date/;
chomp $pattern;
或者选择
$pattern

chomp($Date);
my $pattern = qr/harvester\.log\.$Date/;
my $pattern = qr/harvester\.log\.$Date/;
chomp $pattern;

根据simbabque注释,更好地使用模块,因此您的代码应该

my $Date = localtime->ymd("") ;
最后的代码是

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use Time::Piece;

my @files;
my $logDir = "yourdir";

my $Date = localtime->ymd("") ;

my $pattern = qr/harvester\.log\.$Date/; #dot will match the any character except new line so we should escape it. 

find( 
    sub { push @files, $File::Find::name unless -d; }, 
    $logDir
);
foreach my $file (@files) {
     if ($file =~ $pattern) { print "$file\n"; }
}
结合推送和日期检查

find( 
    sub { push @files, $File::Find::name if($File::Find::name =~m/$pattern/ and -f) }, 
    $logDir
);

@文件中有什么?使用Data::Dumper进行检查。还要注意,
是正则表达式中的元字符。它意味着任何字符。所以你可能想在你的模式中逃避它。除此之外,我不会为
date
,而是使用Time::Piece,它包含在Perl核心中。感谢您的回答,chomp$pattern和Time::Piece模块都工作得很好。我们是否可以将推送和模式搜索结合到一个进程中,这样阵列将有今天生成的日志
find(sub{push@files,$File::find::name,除非-d;},$logDir);foreach my$file(@files){if($file=~$pattern){print“$file\n”;}}
my$pattern=“harvester\.log\.$Date”
不会漏掉这些点。事实上,反斜杠对结果字符串没有任何影响。由于您将字符串用作正则表达式模式,因此最好先将其编译为正则表达式模式
my$pattern=qr/harvester\.log\.$Date/
正确