如何使用Perl修剪日志文件?

aks*_*aks 4 perl performance file-io

我最近提出了一种情况,一旦它们超过一定大小,我需要修剪一些相当大的日志文件.除了每个文件中的最后1000行之外的所有内容都被处理掉,作业每隔半小时由cron运行一次.我的解决方案是简单地浏览文件列表,检查大小并在必要时修剪.

for $file (@fileList) {
  if ( ((-s $file) / (1024 * 1024)) > $CSize) {
      open FH, "$file" or die "Cannot open ${file}: $!\n";
      $lineNo = 0;
      my @tLines;

      while(<FH>) {
        push @tLines, $_;
        shift @tLines if ++$lineNo < CLLimit;
      }
      close FH;

      open FH, ">$file" or die "Cannot write to ${file}: $!\n";
      print FH @tLines;
      close FH;
}
Run Code Online (Sandbox Code Playgroud)

这在当前形式下工作,但是对于大型日志文件(尤其是具有100_000 +行的文件)存在大量开销,因为需要读取每一行并在必要时进行移位.

有没有什么方法可以只读取文件的一部分,例如在这种情况下我希望只能访问最后的"CLLimit"行.由于脚本部署在一个已经看到更好日子的系统上(想想Celeron 700MHz和64MB RAM),我正在寻找使用Perl的更快的替代方案.

Jay*_*Jay 8

我意识到你想要使用Perl,但如果这是一个UNIX系统,为什么不使用"tail"实用程序进行修剪呢?您可以使用非常简单的脚本在BASH中执行此操作:

if [ `stat -f "%z" "$file"` -gt "$MAX_FILE_SIZE" ]; then
    tail -1000 $file > $file.tmp
    #copy and then rm to avoid inode problems
    cp $file.tmp $file
    rm $file.tmp
fi
Run Code Online (Sandbox Code Playgroud)

话虽这么说,你可能会发现这篇文章非常有用,如果你已经开始使用Perl了.