awk:提取具有更高日期的 ips 事件

awk: extract ips occurrences with higher date

我需要从 Apache 的 access.log 中提取一些数据,我尝试使用 awk 命令 我需要列出所有 IP,按它们出现的次数(降序)以及收到请求的时间更接近当前请求的时间排序。

access.log的模式如下

LogFormat "%h %t \"%!200,304,302r\" %>s %O \"%!200,304,302{User-Agent}i\"" combined

产生

192.168.0.147 [08/Aug/2016:10:55:14 +0200] "GET /requestPath/ HTTP/1.1" 401 1638 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" 

我只能制作这个脚本

awk '{print }' /var/log/apache2/access.log | sort | uniq -c | sort -fr

但我现在不知道如何提取日期

更清楚 access.log

192.168.0.147 [01/Aug/2016:10:55:14 +0000] ...
192.168.0.147 [02/Aug/2016:10:55:14 +0000] ... 
192.168.0.147 [02/Aug/2016:11:55:14 +0000] ...
192.168.0.122 [08/Aug/2016:10:15:11 +0000] ...

期望的输出

3 192.168.0.147 02/Aug/2016:11:55:14
1 192.168.0.122 08/Aug/2016:10:15:11

非常感谢任何帮助! 谢谢

可能是这样的:

$ awk '{sub(/^\[/,"",); a[]=;c[]++} END {for(i in a) print c[i],i,a[i]}' c
3 192.168.0.147 02/Aug/2016:11:55:14
1 192.168.0.122 08/Aug/2016:10:15:11

日期是每个特定IP的最后记录日期。

{
    sub(/^\[/,"",) # remove [
    a[]=" "    # each ip gets it's own array element where last record is stored
    c[]++}         # ips are counted
END {
    for(i in a)      # print count and last record
        print c[i],i,a[i]
}

将IP地址收集到散列中;每次看到新匹配项时替换该值;然后在最后打印出哈希值。

awk -F '[ [\t]+' '{ d[] =  } END { for (i in d) print i, d[i] }' access.log
awk -F"[] []" '{a[]++;b[]=} END{for ( i in a) print a[i],i,b[i]}' access.log

无需将整个文件存储在内存中:

$ awk -F'[[ ]+' '!=p{ if (NR>1) print c, p, t; c=0} {c++; p=; t=} END{print c, p, t}' access.log
3 192.168.0.147 02/Aug/2016:11:55:14
1 192.168.0.122 08/Aug/2016:10:15:11