如何使用Perl从目录列表中的许多文件中获取特定信息

时间:2014-05-07 02:31:59

标签: regex perl

我有一个像这样的目录结构

$workdir/XXXX/YYYY.log. 

其中XXXX是子目录名(有许多子目录),YYYY是日志文件名(也有很多日志文件)。

我需要从所有日志中提取一些信息。目前我使用

@Info = qx(grep "information" -r $workdir) 

然后将@Info输出到文件中以执行此操作。

有更有效的方法吗?

1 个答案:

答案 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/;
    }
  }
}