如何快速找到与正则表达式匹配的文件的第一行?

时间:2008-12-13 14:30:37

标签: regex perl sed grep

我想在Perl脚本中使用正则表达式在文件中搜索一行。

假设它在安装了grep的系统中,最好是:

  • 通过grep命令
  • 调用外部open() 直接
  • open()该文件并使用while循环和if ($line =~ m/regex/)

7 个答案:

答案 0 :(得分:9)

在现代Perl实现中,正则表达式代码应该与grep一样快,但如果你关注性能,为什么不简单地尝试一下呢?从代码清洁度和健壮性的角度来看,调用外部命令行工具绝对不是好事。

答案 1 :(得分:6)

您无需明确open文件。

my $regex = qr/blah/;
while (<>) {
  if (/$regex/) {
    print;
    exit;
  }
}
print "Not found\n";

由于您似乎对性能感到担忧,因此我将匹配和print使用默认$_提供,而不是将<>分配给任何内容,这稍微快一点。在正常的生产代码中,

while (my $line = <>) {
  if ($line =~ /$regex/) {
    print $line;
    exit;
  }
}

将是首选。

编辑:这假定要检查的文件是在命令行上给出的,我刚刚注意到你没有说明你的情况。

答案 2 :(得分:5)

使用grep时要注意的一件事:在最近的Linux发行版中,如果你的LANG环境变量定义了UTF-8类型(例如我的是LANG = en_GB.UTF-8)那么grep,sed,sort和可能是一堆其他文本处理实用程序运行速度大约慢10倍。如果您正在进行性能比较,请注意这一点。我现在将我的grep命令别名:

LANG= LANGUAGE= /bin/grep

编辑:实际上,它更像是慢100倍

答案 3 :(得分:3)

取决于。

  • 在Perl中工作可以节省流程启动时间和其他相关资源成本。
  • grep可能比在Perl中做同样的工作更快,但不是很大。

除非性能迫使你进行优化,否则我会说要用Perl来做。

答案 4 :(得分:3)

这取决于。如果您想优化开发时间,

$line = `grep '$regex' file | head -n 1`;

显然是要做的事情。

但它的代价是必须启动外部进程,这取决于安装perl之外的东西,并且在出现问题时失去了进行详细错误报告的机会。

答案 5 :(得分:2)

sed '/pattern/q' file

答案 6 :(得分:1)

我曾经做过一个脚本来搜索一些大文本文件(每个大约10 MB)的正则表达式。我用Perl正则表达式做到了,并注意到它很慢。所以我尝试从脚本中运行grep,速度提升相当可观。因此,根据我自己的经验,Perl内置正则表达式比grep慢。但你可能只会注意到大文件。我的建议是:尝试两种方式,看看它是怎么回事。