0

我有许多日志,每天存储在我的 var/log 目录中的以下名称下:

日志20130601 日志20130602 日志20130603 ...

每个日志有很多行。例如,如果我打开 log20130529,我会发现:

    2013-05-29T15:55:05 [INFO] access_time:1369810505, item_id:1, start, 
    2013-05-29T15:55:05 [INFO] access_time:1369810505, item_id:2, start, 
    ....

我想做的是制作一个将最后 7 个文件分组的文件。例如,如果今天我们是 20130611,通过运行脚本,我应该能够拥有一个临时文件,其中包含 log20130611 log20130610 log 20130609 log20130608 log20130607 log20130606 和 log201305 的内容。因此,如果每个文件都有 4 行,那么新的临时文件应该有 28 行。

到目前为止,我所知道的是如何使用“glob”读取最后 7 个文件:

    my @file_locations = reverse sort glob("/home/adrian/app/var/log/log*");                                                                               
    if ( @file_locations > 7 ) { $#file_locations = 6; }    

但我不知道如何将它们分组到一个文件中。有任何想法吗?

4

2 回答 2

3
for my $qfn_in (@file_locations) {
    open(my $fh_in, '<', $qfn_in) or die $!;
    print($fh_out $_) while <$fh_in>;
}

作为一个单行:

perl -pe'BEGIN {
   @ARGV = reverse sort @ARGV;
   splice(@ARGV, 7);
}' /home/adrian/app/var/log/log* > combined
于 2013-06-11T05:33:29.587 回答
0

如果我还没有使用 Perl,如果我不想将它添加到现有脚本中,那么我会做这样的事情:

cat $(ls /home/adrian/app/var/log/log*|head -7) > /home/adrian/app/var/log/combined.log

否则,ikegami的解决方案很好。如果 strace 显示 perl 对您来说每过少的 I/O 使用过多的系统调用,您可以使用您选择的缓冲区大小下拉到 sysread/syswrite。

于 2013-06-11T05:40:59.260 回答