我有一个访问者的日志文件,跨越了超过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"一点都不。
答案 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次访问
我建议您将日志文件重新格式化为数据库,以便更轻松地查询。这样你只需要处理一次日志文件;此后你的查询将是即时的