我需要从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] ...
任何帮助都将受到高度赞赏! 感谢名单
答案 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