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

时间:2016-08-08 09:56:04

标签: date awk text-parsing

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

access.log的模式如下

return jdbcTemplate.query(query, values.toArray(), resultSetExtractor);

产生

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" 

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

更清楚 的access.log

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

期望的输出

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] ...

任何帮助都将受到高度赞赏! 感谢名单

4 个答案:

答案 0 :(得分:0)

像这样的东西,也许:

$ awk '{sub(/^\[/,"",$2); a[$1]=$2;c[$1]++} 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(/^\[/,"",$2) # remove [
    a[$1]=$1" "$2    # each ip gets it's own array element where last record is stored
    c[$1]++}         # ips are counted
END {
    for(i in a)      # print count and last record
        print c[i],i,a[i]
}

答案 1 :(得分:0)

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

awk -F '[ [\t]+' '{ d[$1] = $2 } END { for (i in d) print i, d[i] }' access.log

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

$ awk -F'[[ ]+' '$1!=p{ if (NR>1) print c, p, t; c=0} {c++; p=$1; t=$2} 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