我有一个特殊类型的CSV文件,其格式类似于以下(我在Linux AWK的帮助下从网络日志中提取了这些列):
SourceIP=10.0.0.1,DestIP=11.0.0.1,InputBytes=120,OutputBytes=2450
SourceIP=10.0.0.1,DestIP=11.0.1.1,InputBytes=450,OutputBytes=110
SourceIP=10.0.0.2,DestIP=11.0.2.2,InputBytes=180,OutputBytes=0
SourceIP=10.0.0.3,DestIP=13.0.7.1,InputBytes=20175,OutputBytes=15314
SourceIP=10.0.0.1,DestIP=19.0.1.1,InputBytes=350151,OutputBytes=1501
SourceIP=10.0.0.2,DestIP=45.0.12.1,InputBytes=2400,OutputBytes=21450
SourceIP=10.0.0.2,DestIP=47.10.0.1,InputBytes=74510,OutputBytes=850
SourceIP=10.0.0.1,DestIP=11.0.0.1,InputBytes=37581,OutputBytes=3250
SourceIP=10.0.0.3,DestIP=11.0.0.1,InputBytes=1300,OutputBytes=67
SourceIP=10.0.0.1,DestIP=11.0.1.1,InputBytes=45010,OutputBytes=1120
我需要接收一个给定的源IP地址作为参数,例如"10.0.0.1",然后对每个DestIP分别求和InputBytes的总数(并打印它们),然后是OutputBytes的总数(然后打印它们). 理想情况下,期望的输出是这样的:
>file.py log.csv 10.0.0.1
10.0.0.1 connected to 19.0.1.1 with 350151 InputBytes
10.0.0.1 connected to 11.0.1.1 with 45460 InputBytes
10.0.0.1 connected to 11.0.0.1 with 37701 InputBytes
10.0.0.1 connected to 11.0.0.1 with 5700 OutputBytes
10.0.0.1 connected to 19.0.1.1 with 1501 OutputBytes
10.0.0.1 connected to 11.0.1.1 with 1230 OutputBytes
一些观察:
- 可以安全地假设所有四个原始字段都将出现。
- 关于输出的事情(理想情况下)是为每个组(分别为InputBytes和OutputBytes)排序,因为这个想法是确定哪个目的地地址接收/发送了更多的信息。
- 不幸的是,我没有一个代码开始(我只是熟悉文件读取虽然)
感谢您的帮助!
我写了这样一个实现:
from collections import defaultdict
import sys
big_d = defaultdict(dict)
with open("tmp.csv") as f:
for j, line in enumerate(f):
attr = line.split(',')
d = {}
for a in attr:
key, val = a.split('=')
d[key] = val
try:
big_d[d['SourceIP']][d['DestIP']]['in'] += int(d['InputBytes'])
big_d[d['SourceIP']][d['DestIP']]['out'] += int(d['InputBytes'])
except:
big_d[d['SourceIP']][d['DestIP']] = {'in' : int(d['InputBytes']), 'out':int(d['InputBytes']),}
input_ip = sys.argv[1]
for dest_ip in big_d[input_ip]:
print input_ip, "connected to", dest_ip, "with", big_d[input_ip][dest_ip]['in'], "InputBytes"
print input_ip, "connected to", dest_ip, "with", big_d[input_ip][dest_ip]['out'], "OutputBytes"
输出:
~ python tmp.py 10.0.0.1
10.0.0.1连接到11.0.0.1与37701 InputBytes
10.0.0.1连接到11.0.0.1与37701 OutputBytes
10.0.0.1连接到11.0.1.1与45460 InputBytes
10.0.0.1连接到11.0.1.1与45460 OutputBytes
10.0.0.1连接到19.0.1.1与350151 InputBytes
10.0.0.1连接到19.0.1.1与350151 OutputBytes
tmp.csv是您的输入文件。
我相信它能满足你所有的要求。