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