【发布时间】:2011-02-19 23:07:44
【问题描述】:
我正在编写一个日志分析应用程序,并希望在两个特定日期之间获取 apache 日志记录。假设日期格式如下:22/Dec/2009:00:19 (day/month/year:hour:minute)
目前,我正在使用正则表达式将月份名称替换为其数值,删除分隔符,因此上述日期转换为:221220090019 使日期比较变得微不足道.. 但是..
对大文件的每条记录运行正则表达式,比如包含 25 万条记录的记录,成本非常高。还有其他不涉及正则表达式替换的方法吗?
提前致谢
编辑:这是进行转换/比较的函数
function dateInRange(t, from, to) {
sub(/[[]/, "", t);
split(t, a, "[/:]");
match("JanFebMarAprMayJunJulAugSepOctNovDec", a[2]);
a[2] = sprintf("%02d", (RSTART + 2) / 3);
s = a[3] a[2] a[1] a[4] a[5];
return s >= from && s <= to;
}
“from”和“to”是上述格式的间隔,“t”是原始 apache 日志日期/时间字段(例如 [22/Dec/2009:00:19:36)
【问题讨论】:
-
也许除了您的要求之外,但是当 ISO 8601 即
200912220019有这么多好处时,您到底为什么想要拥有221220090019? en.wikipedia.org/wiki/ISO_8601 -
真的没有想过......这些好处与易于比较/性能有关吗?大多数记录都在同一年、月、日和(偶尔)同一小时内,所以也许是的?
-
在您的情况下,最重要的好处是 ISO 8601 的时间顺序和字母顺序变得相同。它使年龄排序变得非常简单。也许这不是您现在需要的东西,但请帮自己一个忙,开始使用 8601 做所有事情,除非您有充分的理由不这样做。其他福利也列在cl.cam.ac.uk/~mgk25/iso-time.html。