关于正则表达式:如何使用 Perl 从目录列表中的许多文件中 grep 特定信息

How to use Perl to grep specific information from many files in a list of directories

本问题已经有最佳答案,请猛点这里访问。

我有一个这样的目录结构

1
$workdir/XXXX/YYYY.log.

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

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

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

然后将 @Info 输出到一个文件来执行此操作。

有没有更有效的方法来做到这一点?


我会在纯 Perl 中使用类似的东西。我认为很多问题在于无法保证该过程正在取得进展。此解决方案将遇到的每个子目录和每个日志文件的名称打印到 STDERR,但将所有 grepped 行发送到 STDOUT。

您必须修改 while 循环中的条件,以便选择正确的行。

如果您愿意,生成"完成百分比"数字或估计完成时间不会太难。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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\
"
;

  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\
"
;
    open my $fh, '<', $log;
    while (<$fh>) {
      print"    $_" if /condition/;
    }
  }
}