2017-01-27 1 views
2

동일한 호스트 이름을 가진 두 파일을 비교할 방법이 필요합니다. 호스트 이름을 구문 분석하여 목록에 저장하는 함수를 작성했습니다. 일단 내가 가지고 있으면 파일을 비교할 수 있어야합니다.일단 호스트 이름이있는 파일 비교

각 파일은 다른 디렉토리에 있습니다.

1 단계 : 각 파일에서 "호스트 이름"을 검색하십시오. 2 단계 : 두 개의 디렉토리에서 동일한 "호스트 이름"을 가진 파일에 대해 비교를 실행하십시오.

def hostname_parse(directory): 
    results = [] 
    try: 
     for filename in os.listdir(directory): 
      if filename.endswith(('.cfg', '.startup', '.confg')): 
       file_name = os.path.join(directory, filename) 
       with open(file_name, "r") as in_file: 
        for line in in_file: 
         match = re.search('hostname\s(\S+)', line) 
         if match: 
          results.append(match.group(1)) 
          #print "Match Found" 
     return results 
    except IOError as (errno, strerror): 
     print "I/O error({0}): {1}".format(errno, strerror) 
     print "Error in hostname_parse function" 

샘플 데이터 :

테스트 파일 : 호스트 이름이 19-30이 경우에

19-30# 
! 
version 12.3 
service timestamps debug datetime msec 
service timestamps log datetime msec 
service password-encryption 
! 
hostname 19-30 
! 
boot-start-marker 
boot-end-marker 
! 
ntp clock-period 17179738 
ntp source Loopback0 
! 
end 

19-30# 

는 호스트 코드를 검색합니다. 테스트의 편의를 위해 방금 동일한 파일을 사용했지만 동일하거나 동일하지 않도록 수정했습니다.

위와 같이. 호스트 이름을 추출 할 수 있지만 발견 된 호스트 이름을 기반으로 파일을 비교하는 방법을 찾고 있습니다.

사물의 핵심은 파일 비교입니다. 그러나 특정 분야를 볼 수있게되면 내가 성취하고자하는 것이 될 것입니다. 처음에는 파일이 동일하다는 것을 알기 위해 찾고 있습니다. 대/소문자 구분은 동일한 형식의 cisco 생성 파일이므로 중요하지 않습니다. 파일의 내용이 "구성"변경 사항을 찾는 데 더 중요합니다.

+0

비교 대상에 대해 좀 더 구체적으로 설명해야합니다. 파일이 동일한 지 찾고 있습니까? 대소 문자 구분/주문 또는 내용에 대해 관심이 있습니까? 비교해야 할 특정 필드가 있습니까? 이것은 매우 광범위한 질문입니다. – flyingmeatball

답변

1

다음은 요구 사항을 충족시키는 데 필요한 몇 가지 코드입니다. 테스트 할 방법이 없었기 때문에 몇 가지 문제가있을 수 있습니다. 해시 lib를 사용하여 변경 내용을 찾는 방법으로 파일 내용의 해시를 계산합니다.

import hashlib 
import os 
import re 

HOSTNAME_RE = re.compile(r'hostname +(\S+)') 

def get_file_info_from_lines(filename, file_lines): 
    hostname = None 
    a_hash = hashlib.sha1() 
    for line in file_lines: 
     a_hash.update(line.encode('utf-8')) 
     match = HOSTNAME_RE.match(line) 
     if match: 
      hostname = match.group(1) 
    return hostname, filename, a_hash.hexdigest() 

def get_file_info(filename): 
    if filename.endswith(('.cfg', '.startup', '.confg')): 
     with open(filename, "r") as in_file: 
      return get_file_info_from_lines(filename, in_file.readlines()) 

def hostname_parse(directory): 
    results = {} 
    for filename in os.listdir(directory): 
     info = get_file_info(filename) 
     if info is not None: 
      results[info[0]] = info 
    return results 

results1 = hostname_parse('dir1') 
results2 = hostname_parse('dir2') 

for hostname, filename, filehash in results1.values(): 
    if hostname in results2: 
     _, filename2, filehash2 = results2[hostname] 
     if filehash != filehash2: 
      print("%s has a change (%s, %s)" % (
       hostname, filehash, filehash2)) 
      print(filename) 
      print(filename2) 
      print() 
+0

@Stephen Rauch이게 내가 뭘 찾고 있는지 고맙다. filename = os.path.join (directory, filename)을 추가해야했는데, 파일 누락 오류가 발생했기 때문입니다. 하지만 이제 AttributeError가 나타납니다. 'NoneType'객체에는 33 행에 'values'속성이 없습니다. – NineTail

+0

@NineTail 누락 된 수익을 추가했습니다. –

+0

예, 지금 보니, 고마워요. – NineTail

관련 문제