我有一个像这样的目录结构
$workdir/XXXX/YYYY.log.
其中XXXX
是子目录名(有许多子目录),YYYY
是日志文件名(也有很多日志文件)。
我需要从所有日志中提取一些信息。目前我使用
@Info = qx(grep "information" -r $workdir)
然后将@Info
输出到文件中以执行此操作。
有更有效的方法吗?
答案 0 :(得分:1)
我会在纯Perl中使用这样的东西。我认为很多问题是没有保证这个过程正在进行中。此解决方案在遇到时将每个子目录的名称和每个日志文件打印到STDERR,但将所有grepped行发送到STDOUT。
您必须修改while
循环中的条件,以便选择正确的行。
如果这是您想要的,那么产生“完成百分比”数字或估计完成时间并不会太难。
use strict;
use warnings;
use autodie;
use File::Spec;
my $workdir = '/path/to/work/dir';
opendir my($dh), '.';
my @subdirs = grep { -d and /\A[^.]/ } readdir $dh;
closedir $dh;
for my $subdir (@subdirs) {
$subdir = File::Spec->catdir($workdir, $subdir);
print STDERR "$subdir\n";
opendir my($dh), $subdir;
my @logs = grep { /\.log\z/i } readdir $dh;
closedir $dh;
@logs = grep { -f } map { File::Spec->catfile($subdir, $_) } @logs
for my $log (@logs) {
print STDERR " $log\n";
open my $fh, '<', $log;
while (<$fh>) {
print " $_" if /condition/;
}
}
}