2011-04-13 00:09:07,731 信息 [标准输出] 04/13 00:09:07 信息...
大家好。我会发布我的一些代码,但我什至认为它不值得发布。我想要做的是我有一个日志文件,上面有类似的行。我需要做的是获取最后一行的时间戳,并保留最后 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 分钟的条目。
我认为吉姆加里森的解决方案可以修补以取代这个:
$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”近似为足够长以超过日志中的至少一行。如果您希望日志中有长行,则可以将其设置得更高,但据我所见,最后一个日志条目“应该”相当短。
如果您有一个巨大的日志文件并希望在以下搜索中提高性能,您可以使用估计并执行搜索以查找文件中的最后一个,例如 1000000 字节:
seek F, -1000000, 2;
祝你好运!
使用正则表达式抓取:00:09:07 遍历所有行,并检查当前时间(本地时间等)。如果文件包含来自不同日期的条目,则还使用正则表达式获取日期,并再次使用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