在日志文件中计算每日访问者数

时间:2016-08-04 23:52:09

标签: ruby bash perl logging sed

我有一个访问者的日志文件,跨越了超过1。5年。每一行代表一个页面加载。每行的结构如下:

2016-08-05 00:48:10 +0200 -> 170.67.51.153   -> Beijing - Beijing Shi: China -> http://example.com/?ref=1676 -> Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) -> AS55966 Beijing Baidu Netcom Science and Technology Co., Ltd. -> Beijing Baidu Netcom Science and Technology Co. -> 0.9301

我用" - > "划分字段。

我的日志文件大小约为50MB,解析整个文件需要很长时间才能获得今天或昨天的访问者数量,因为这些实际的行当然是在文件。

我想使用bash命令" tac"这是一个反向的" cat"或类似的技术,以相反的顺序获得线条。我的第一次尝试是(例如2016-08-04的每日访问者):

tac visitor_log.txt|grep 2016-08-04|cut -d " " -f 5|sort|uniq|wc -l

它当然会输出访问者数量,但不幸的是,它读取整个文件也很耗时,因为人们无法告诉" grep"如果前一行匹配且实际行不匹配,则停止匹配行。

也许我应该效仿" tac"在Ruby中有效地获取每日访客数量?或者我应该使用一些可能在" sed"?中使用的触发器技术?不幸的是,我不知道" sed"一点都不。

1 个答案:

答案 0 :(得分:3)

如果没有更多信息,很难知道如何提供帮助,但这个Perl程序会显示每天记录的访问次数

程序期望输入文件作为命令行上的参数。输出与您提供的样本数据一样简单,并显示2016年8月5日的单次访问

use strict;
use warnings 'all';

my %visits;

while ( <> ) {
    next unless /^(\d\d\d\d-\d\d-\d\d)/;
    ++$visits{$1};
}

for my $date ( sort keys %visits ) {
    printf "%s  --  %d\n", $date, $visits{$date};
}

输出

2016-08-05  --  1

如果您的文件实际上只有50MB

,则应该只需要一两秒钟

我已经通过复制您显示的行来测试以创建一个50MB的文件,并且在不到半秒的时间内处理,在一天内报告162,823次访问

我建议您将日志文件重新格式化为数据库,以便更轻松地查询。这样你只需要处理一次日志文件;此后你的查询将是即时的