统计多项数据
如下内容,第一个字段是IP,第二个字段是每个访问的uri。
1.1.1.1 /index1.html
1.1.1.1 /index1.html
1.1.1.1 /index2.html
1.1.1.1 /index2.html
1.1.1.1 /index2.html
1.1.1.1 /index3.html
1.1.1.2 /index1.html
1.1.1.2 /index2.html
1.1.1.2 /index2.html
1.1.1.3 /index1.html
1.1.1.3 /index1.html
1.1.1.3 /index2.html
1.1.1.3 /index2.html
1.1.1.3 /index2.html
1.1.1.3 /index3.html
1.1.1.3 /index3.html
1.1.1.4 /index2.html
1.1.1.4 /index2.html
要求统计出每个ip访问的总次数,以及每个ip所访问的uri的次数。
期望的输出结果:
1.1.1.1 6 /index3.html 1
1.1.1.1 6 /index2.html 3
1.1.1.1 6 /index1.html 2
1.1.1.2 3 /index2.html 2
1.1.1.2 3 /index1.html 1
1.1.1.3 7 /index3.html 2
1.1.1.3 7 /index2.html 3
1.1.1.3 7 /index1.html 2
1.1.1.4 2 /index2.html 2
方法1,使用子数组。awk代码:
awk '
{
a[$1][$2]++
}
END{
# 遍历数组,统计每个ip的访问总数
for(ip in a){
for(uri in a[ip]){
b[ip] += a[ip][uri]
}
}
# 再次遍历
for(ip in a){
for(uri in a[ip]){
print ip, b[ip], uri, a[ip][uri]
}
}
}
' a.log
方法2,使用复合索引的数组。awk代码:
awk '
{
a[$1]++
b[$1"_"$2]++
}
END{
for(i in b){
split(i,c,"_");
print c[1],a[c[1]],c[2],b[i]
}
}' a.log