我有一个标准系统日志格式的日志文件。它看起来像这样,除了每秒数百行:
Jan 11 07:48:46 blahblahblah...
Jan 11 07:49:00 blahblahblah...
Jan 11 07:50:13 blahblahblah...
Jan 11 07:51:22 blahblahblah...
Jan 11 07:58:04 blahblahblah...
它不会在午夜滚动,但它永远不会超过两天。
我经常不得不从这个文件中提取一个时间片。我想为此编写一个通用脚本,我可以这样称呼它:
$ timegrep 22:30-02:00 /logs/something.log
...并让它从 22:30 拉出线,然后穿过午夜边界,直到第二天凌晨 2 点。
有几个注意事项:
- 我不想费心在命令行上输入日期,只是时间。该程序应该足够聪明以找出它们。
- 日志日期格式不包括年份,因此它应该根据当前年份进行猜测,但仍然在元旦前后做正确的事情。
- 我希望它快——它应该使用行是为了在文件中四处寻找并使用二进制搜索的事实。
在我花很多时间写这篇文章之前,它是否已经存在?
更新:我已经用经过大量改进的更新版本替换了原始代码。让我们称之为(实际?)阿尔法质量。
该版本包括:
try
街区原文:
好吧,你知道什么?“寻找”,你就会找到!这是一个 Python 程序,它在文件中四处寻找并使用或多或少的二进制搜索。它比其他人编写的 AWK 脚本要快得多。
它是(前?)阿尔法质量。它应该有
try
块和输入验证以及大量的测试,毫无疑问可能更 Pythonic。但这里是供您娱乐的。哦,它是为 Python 2.6 编写的。新代码:
这将根据条目与当前时间(“现在”)的关系来打印开始时间和结束时间之间的条目范围。
用法:
例子:
(
-l
long) 选项会导致最长的输出。如果开始时间的小时和分钟值小于结束时间和现在,则开始时间将被解释为昨天。如果开始时间和结束时间 HH:MM 值都大于“现在”,则结束时间将被解释为今天。假设“现在”是“1 月 11 日 19:00”,这就是各种示例开始和结束时间的解释方式(
-l
除非另有说明):几乎所有的脚本都设置好了。最后两行完成所有工作。
警告:没有进行参数验证或错误检查。边缘案例尚未经过彻底测试。这是使用
gawk
其他版本的 AWK 编写的,可能会发出声音。我认为 AWK 在搜索文件方面非常有效。我认为在搜索未索引的文本文件时,其他任何事情都不一定会更快。
从网上的快速搜索中,有些东西是根据关键字(如 FIRE 或类似 :) 提取的,但没有从文件中提取日期范围的东西。
执行您的建议似乎并不难:
看起来很简单,如果你不介意 Ruby,我可以为你写它:)
一个应用二进制搜索的 C++ 程序——它需要一些简单的修改(即调用 strptime)来处理文本日期。
http://gitorious.org/bs_grep/
我有一个支持文本日期的早期版本,但是对于我们的日志文件的规模来说仍然太慢了;profiling 表示超过 90% 的时间都花在了 strptime 上,因此,我们只是修改了日志格式以包含数字 unix 时间戳。
即使这个答案为时已晚,但它可能对某些人有益。
我已将@Dennis Williamson 的代码转换为可用于其他 Python 内容的 Python 类。
我添加了对多个日期支持的支持。