我最近提出了一种情况,一旦它们超过一定大小,我需要修剪一些相当大的日志文件.除了每个文件中的最后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() { push @tLines, $_; shift @tLines if ++$lineNo < CLLimit; } close FH; open FH, ">$file" or die "Cannot write to ${file}: $!\n"; print FH @tLines; close FH; }
这在当前形式下工作,但是对于大型日志文件(尤其是具有100_000 +行的文件)存在大量开销,因为需要读取每一行并在必要时进行移位.
有没有什么方法可以只读取文件的一部分,例如在这种情况下我希望只能访问最后的"CLLimit"行.由于脚本部署在一个已经看到更好日子的系统上(想想Celeron 700MHz和64MB RAM),我正在寻找使用Perl的更快的替代方案.
我意识到你想要使用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
话虽这么说,你可能会发现这篇文章非常有用,如果你已经开始使用Perl了.