【问题标题】:Need to get unique url's from the apache acess log - with their count需要从 apache 访问日志中获取唯一的 url - 以及它们的数量
【发布时间】:2019-04-03 09:12:42
【问题描述】:

我需要从 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

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

我希望输入一个特定的时间范围,例如:11:00:00,12:00:00 - 例如一个小时,输出要分组,计算 url:

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

【问题讨论】:

  • 请在您的帖子中发布一些输入和预期输出示例,然后让我们知道。
  • 更新了问题

标签: apache grep


【解决方案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

【讨论】:

  • 由于某种原因没有输出任何东西
  • 对于您显示的示例输入,它对我很有效,您能否通过 cat -v Input_file 检查您是否有 Control M 字符并告诉我?
  • 使用cat -v input_files 会输出结果,但您的脚本由于某种原因没有。
【解决方案2】:

我确实设法获得了一个有效的 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();使用 2 个参数作为日期/小时调用 bash 脚本并等待输出文件,然后解析该文件。

我希望有人利用这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2011-07-27
    相关资源
    最近更新 更多