2016-12-05 7 views
0

사용자 ID와 IP 주소가있는 큰 로그 파일이 있습니다. 특정 IP가 얼마나 많은 사용자 ID에 로그인했는지 확인하는 가장 좋은 방법을 결정하려고합니다.여러 열을 기준으로 계산

처음에는 명령 줄에서 cut, sort 및 uniq를 통해이 작업을 수행 할 수 있다고 생각했지만 원하는 출력을 얻지 못했습니다. 파이썬 또는 bash 솔루션이 이상적입니다.

eric - 1.1.1.1, 2.2.2.2, 4.4.4.4 
brian - 1.1.1.1 
jeff - 1.1.1.1, 3.3.3.3 
bob - 3.3.3.3 
peter - 4.4.4.4 

뿐만 아니라 :

1.1.1.1 - eric, brian, jeff 
2.2.2.2 - eric 
3.3.3.3 - bob, jeff 
4.4.4.4 - peter 

나는 이러한 유형의 정보를 표시하도록 출력을 싶습니다

eric 1.1.1.1 
eric 1.1.1.1 
brian 1.1.1.1 
jeff 1.1.1.1 
eric 2.2.2.2 
bob 3.3.3.3 
jeff 3.3.3.3 
eric 1.1.1.1 
eric 1.1.1.1 
eric 4.4.4.4 
peter 4.4.4.4 

: 아래

파일의 예입니다 그것이 성숙함에 따라, 배제 IP를위한 변수를 만들어야 할 것입니다. 1.1.1.1이 NAT이고 신뢰할 수 있기 때문에 우리는 i를 무시할 수 있다고 말할 수 있습니다. 여러 사용자가 그것으로부터 올 것입니다.

올바른 방향으로 밀어 올리는 것이 좋습니다.

+0

음, 파일을'pandas.DataFrame'에로드 한 다음 이름 열'grouby()'에로드하고 마지막으로 각 그룹의 고유 값을 가져옵니다. – Jakub

+0

일부 권장 사항의 전체 스크립트를 원하십니까? – timotree

+0

입력이 그대로이거나 튜플이나 목록 등을 사용할 수 있습니까? – OldBunny2800

답변

4

입력 프로세스 출력 스타일로 작성된 다음 스크립트를 고려하십시오.

일부 노트 :

fileinput 모듈은 명령 줄, 여러 파일 이름, 또는 전혀 파일 이름 (이 경우에 표준 입력을 사용합니다)에 하나의 입력 파일 이름을 지정할 수 있습니다.

defaultdict을 사용하면 편리하게 데이터 집합을 수집 할 수 있습니다.

', ' join은 원하는 쉼표로 구분 된 출력 행을 생성합니다.

리스트 이해 대신 (line.split() for line ...) 표현식을 사용하면 [line.split() for line ...]은 큰 파일이라고 메모리를 저장합니다. 목록 이해력을 사용했다면, 모든 데이터가 메모리에 두 번 저장됩니다.

코드가 만료되면 추가 한 새 기능을 제어하기 위해 argparse으로 전환 할 수 있습니다.

import fileinput 
import collections 

# Input the data 
raw_data = (line.split() for line in fileinput.input()) 

# Process the data 
name2ip = collections.defaultdict(set) 
ip2name = collections.defaultdict(set) 
for name, ip in raw_data: 
    name2ip[name].add(ip) 
    ip2name[ip].add(name) 

# Output the data 
for name, ips in name2ip.items(): 
    print '%s - %s'%(name, ', '.join(ips)) 

for ip, names in ip2name.items(): 
    print '%s - %s'%(ip, ', '.join(names)) 
+0

빠른 응답 Rob을 가져 주셔서 감사합니다. 나는 내일 그것과 함께 놀 것이다. – Eric

+0

코드에 다시 한 번 감사드립니다. 나는 오늘 그것으로 노는 것을 시작했고, 내가 원하는 결과물을 제공하는 훌륭한 일을한다. 또한 모든 것에 대한 자세한 정보를 제공해 주셔서 감사 드리며 앞으로도 매우 유용 할 것입니다. 지금해야 할 일은 시간에 가장 고유 한 IP가있는 이름과 IP 섹션에서 가장 많은 이름을 가진 IP가 표시되는 출력을 정렬하는 것입니다. – Eric

+0

실제 로그에서이 코드를 실행하려고했는데 "for name, ip in raw_data :"행에 "ValueError : 포장을 푸는 값이 너무 많습니다."라는 말이 실패했습니다. 나는 각 약 80 MB의 압축 된 ~ 20 log.gz 파일을 압축했습니다. 오류가 발생했을 때 "zcat log_file.log.gz | code.py"라는 줄을 사용하여 시도해 보았습니다. 이 구문은 내 작은 테스트에서 잘 작동합니다. – Eric

관련 문제