我最近提出了一种情况,一旦它们超过一定大小,我需要修剪一些相当大的日志文件.除了每个文件中的最后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;
}
这在当前形式下工作,但是对于大型日志文件(尤其是具有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,你可能会发现this post非常有帮助.
