需要从apache访问日志中获取唯一的url-及其数量

时间:2019-04-03 09:12:42

标签: apache grep

我需要从apache访问日志文件中打印具有唯一URL计数的唯一URL,并且需要在特定的日期范围内进行。

我们有一个使用GET获取参数的日志记录url,因此最好对访问文件进行排序以查找唯一的url,在日期范围内对其进行计数,然后将其插入数据库中,而不是主动插入每个连接。

访问日志采用以下格式:

11.111.11.111 - - [03/Apr/2019:11:43:11 +0300] "GET /url.php?parameter=&2nd_parameter=15&mana=587&something_else=mana HTTP/1.1" 200 5316 "something:something" "Mozilla/5.0 (Android; U; en-GB) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/29.0" 1152 [url.url.com]

我需要在时间范围内执行此操作,因此我至少可以有一些时间范围,并且文件很大-一天的访问日志可能大于10gb。 grep的结果将用PHP解析。

cat access_ssl.log | awk '{print $7}' | sort -n | uniq -c

产生唯一的URL及其计数。我还需要只获取特定时间范围内的结果。

我希望输入一个特定的时间范围,例如:11:00:0012:00:00-例如一个小时,然后将输出分组,计算网址:

20 /url.php?parameter=&2nd_parameter=15&mana=587&something_else=mana
15 /url.php?parameter=&2nd_parameter=15&mana=577&something_else=something_else

2 个答案:

答案 0 :(得分:1)

如果您对awk表示满意,请尝试以下。

awk 'match($0,/\/url\.php.*_else=[^( HTTP)]*/){++a[substr($0,RSTART,RLENGTH)]} END{for(i in a){print a[i],i}}'  Input_file

现在添加一种非衬里形式的解决方案。

awk '
match($0,/\/url\.php.*_else=[^( HTTP)]*/){
  ++a[substr($0,RSTART,RLENGTH)]
}
END{
  for(i in a){
    print a[i],i
  }
}'  Input_file

答案 1 :(得分:0)

我确实设法得到了一个有效的bash脚本:

#!/bin/sh
DATE1=$1
DATE2=$2
cat /var/log/apache2/access_ssl.log | awk '$4 >= "['${DATE2}'" && $4 < "[i'${DATE2}'"' | awk '{print $7}' | sort -n | uniq -c > file.log

其中php脚本将为exec();调用带有两个参数的bash脚本作为日期/小时并等待输出文件,然后解析该文件。

我希望有人能利用它。