3

2011-04-13 00:09:07,731 信息 [标准输出] 04/13 00:09:07 信息...

大家好。我会发布我的一些代码,但我什至认为它不值得发布。我想要做的是我有一个日志文件,上面有类似的行。我需要做的是获取最后一行的时间戳,并保留最后 5 分钟的所有行(而不是最后 200 行或其他任何......这会更容易)。有人可以帮忙吗?我已经在网上搜索了一些不错的提示,但仍然没有任何进展,而且非常沮丧。谢谢!

4

4 回答 4

5

这是一个简单的 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);
}
于 2011-04-25T19:55:41.847 回答
2

我从您的最新评论中得知,您有兴趣了解如何查找日志中最后一个时间戳,以及在此之前 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;

祝你好运!

于 2011-04-28T14:27:31.703 回答
1

使用正则表达式抓取:00:09:07 遍历所有行,并检查当前时间(本地时间等)。如果文件包含来自不同日期的条目,则还使用正则表达式获取日期,并再次使用locatime的输出进行比较

于 2011-04-25T19:37:11.133 回答
0

如何修改脚本以使其与以下日志一起使用

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
于 2013-12-26T08:01:08.113 回答