我有很多日志,每天都存储在我的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; }
但我不知道如何将它们分组到一个文件中。有什么想法吗?
答案 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。