import sys, collections def read(path): fields=None; rows=[] for line in open(path, errors='replace'): line=line.rstrip('\n') if line.startswith('#fields'): fields=line.split('\t')[1:]; continue if line.startswith('#') or not line: continue p=line.split('\t') rows.append(dict(zip(fields,p))) return rows def f(x): try: return float(x) except: return None for path in sys.argv[1:]: rows=read(path) tup=collections.defaultdict(list) for r in rows: if r.get('proto')!='tcp': continue tup[(r['id.orig_h'],r['id.resp_h'],r['id.resp_p'])].append(r) out=[] for k,rs in tup.items(): ivs=sorted((f(r['ts']), f(r['ts'])+(f(r['duration']) or 0)) for r in rs) # union length tot=0; cs,ce=ivs[0] for s,e in ivs[1:]: if s<=ce: ce=max(ce,e) else: tot+=ce-cs; cs,ce=s,e tot+=ce-cs mx=max((f(r['duration']) or 0) for r in rs) ob=sum(int(r['orig_bytes']) if r['orig_bytes'].isdigit() else 0 for r in rs) rb=sum(int(r['resp_bytes']) if r['resp_bytes'].isdigit() else 0 for r in rs) states=collections.Counter(r['conn_state'] for r in rs) out.append((tot,mx,len(rs),k,ob,rb,dict(states.most_common(3)))) out.sort(reverse=True) allts=[f(r['ts']) for r in rows] print('==',path, 'tcp tuples',len(out),'span_h %.2f'%((max(allts)-min(allts))/3600)) for o in out[:8]: print(' union=%.0fs max=%.0fs n=%d %s ob=%d rb=%d %s'%o)