Perl:将文件分组到单个文件中的脚本

时间:2013-06-11 05:24:47

标签: perl

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

log20130601 log20130602 log20130603 ...

每个日志都有很多行。例如,如果我打开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; }    

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。