日志分析场景中,时常会遇到需要计算哪个ip请求次数最多,哪个ip请求总时延最多,哪个ip或uri请求的数据量最大等等,亦或是做一个求出总和的排序,以下用两种方式来解决此类需求。
日志格式如下:
第一列:ip
第九列:返回状态
第十列:给用户返回的大小
求出第一列每个ip总共返回了多少数据,并进行排序:
1、awk
awk ‘{a[$1]+=$10} END{ for(i in a) print a[i], i}’ LOGFILE | sort -n -k 1 -r
2、python
#!/usr/bin/env python
class GroupSum:
def __init__(self, filename):
self.filename = filename
def sum(self, group_col, sum_col):
group_dist = {}
with open(self.filename, 'r') as f:
for line in f.readlines():
ip = line.split()[group_col-1]
try:
value = int(line.split()[sum_col-1])
except ValueError:
continue
if group_dist.has_key(ip):
group_dist[ip] += value
else:
group_dist[ip] = value
return group_dist
if __name__ == "__main__":
proc_file = GroupSum("/ser/logs/access.log")
result = proc_file.sum(1,10)
result = sorted(result.iteritems(), key=lambda x:x[1])
print result