2011-04-13 00:09:07 INFO [STDOUT] 04/13 00:09:07 Information…
大家好。我会发布一些我的代码,但我甚至不认为它值得发布。我要做的是,我有一个日志文件,上面的行。我需要做的是获取最后一行时间戳,并保留最后5分钟的所有行(而不是最后200行或....这样会更容易)。有人能帮忙吗?我在网上搜索了一些不错的建议,但仍然一无所获,沮丧得要命。谢谢!
下面是一个简单的Perl脚本,它遍历文件并打印时间戳在执行开始时5分钟内的每一行。为了提高效率,并假设行是按时间戳顺序排列的,您可以修改它,在遇到第一个可打印行时设置一个布尔标志,并从该点开始跳过测试。
#!/usr/bin/perl
use POSIX qw(mktime);
$now = time();
while(<>)
{
($yy,$mm,$dd,$h,$m,$s,$t) = /^(d+)-(d+)-(d+)s+(d+):(d+):(d+),(d+)/;
$t = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);
print "$_" if ($t >= $now-300);
}
根据您最近的评论,我认为您有兴趣了解如何找到日志中最后的时间戳,以及在此之前5分钟的条目。
我认为Jim Garrison的解决方案可以被修补以取代这个:
$now = time();
与这个:open F, "<server.log" or die $!;
seek F,-1000,2; # set pos to last 1000 bytes
my @f = <F>;
$_ = $f[$#f];
($yy,$mm,$dd,$h,$m,$s,$t) = /^(d+)-(d+)-(d+)s+(d+):(d+):(d+),(d+)/;
$now = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);
$now
现在应该包含日志中的最后一个时间戳。
我估计"-1000"足够长,至少可以超过日志中的一行。如果您希望日志中有很长的行,您可以将其设置得更高,但从我看到的情况来看,最后一个日志条目"应该"相当短。
如果您有一个巨大的日志文件,并且希望在接下来的搜索中提高性能,您可以使用估计并执行seek来查找文件中的最后1000000字节:
seek F, -1000000, 2;
祝你好运!
遍历所有行,使用regexp grab: 00:09:07,并检查当前时间(本地时间等)。如果文件包含来自不同日期的条目,那么也使用regexp抓取日期,并再次使用locatime
如何修改您的脚本使其与下面的日志一起工作
Dec 18 09:41:18 sd
Dec 18 09:46:29 sds
Dec 18 09:48:39 sds
Dec 18 09:48:54 sds
Dec 18 09:54:47 sds
Dec 18 09:55:33 sds
Dec 18 09:55:38 sds
Dec 18 09:57:58 sds
Dec 18 09:58:10 sds
Dec 18 10:00:50 sdsd
Dec 18 10:03:43 sds
Dec 18 10:03:50 sdsd
Dec 18 10:04:06 sdsd
Dec 18 10:04:15 sdsd
Dec 18 10:14:50 wdad
Dec 18 10:19:16 sdadsa
Dec 18 10:19:23 dsds
Dec 18 10:21:03 sadsd
Dec 18 10:22:54 adas
Dec 18 10:27:32 qadad