我需要从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:00
,12: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
答案 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脚本作为日期/小时并等待输出文件,然后解析该文件。
我希望有人能利用它。