세 개의 이진 파일을 비교하여 1과 2 사이에 변경된 내용만 표시하고 2와 3 사이에 다시 변경된 내용을 표시하는 방법은 무엇입니까?

세 개의 이진 파일을 비교하여 1과 2 사이에 변경된 내용만 표시하고 2와 3 사이에 다시 변경된 내용을 표시하는 방법은 무엇입니까?

세 개의 바이너리 파일(메모리 덤프)이 있습니다. 그들에게 전화해라 file1, file2, file3. 일부 소프트웨어를 디버깅하려고 하는데 스위치를 전환하고 있습니다.

  • file1= 끄다

  • file2= 켜다

  • file3= 끄다

file1와 사이에 어떤 바이트가 변경되었는지 알아야 하며 file2, 그 다음에는 에서 동일한 값(과 file1) 으로 다시 변경됩니다 file3.

file1사이 에는 관련되지 않은 변경 사항이 많이 있으므로 이 스위치를 전환할 때 변경 사항이 무엇인지 파악하는 것만으로 file2는 충분하지 않습니다. , , ,… diff에서 변경되는 고유한 엔트로피 바이트를 식별하려고 합니다.file123

xxd, diff, vimdiff, 와 같은 도구가 있다는 것을 알고 있습니다 colordiff. 이 문제에 어떻게 사용하는 것이 가장 좋은지 잘 모르겠습니다.

답변1

file1file2해당 값 사이에서 변경된 바이트를 확인하려면 다음을 사용하십시오 cmp -l.

cmp -l file1 file2 > changes12

file3및 에 대해서도 마찬가지입니다 file2. 비결은 항상 같은 방향(여기서는 끄고 켜기)으로 조사하는 것입니다. 이것이 file2바로 끝에 다음을 넣은 이유입니다.

cmp -l file3 file2 > changes32

이제 동일한 변경 사항을 찾을 수 있습니다.

comm -12 changes12 changes32

출력은 다음과 같습니다(예).

     1629 152 112

이는 바이트 1629(10진수, 로 시작하는 번호 1) 가 152(8진수) 에서 112(8진수)로 변경되었음을 의미합니다.


노트:

  • cmp -l내 우분투에서는 출력을 "열화"합니다. 즉, 선행 공백이 있는 줄을 인쇄할 수 있으며 첫 번째 열의 너비는 입력 크기에 따라 달라집니다. 일부 구현에서는 이 작업을 수행하지 못할 수도 있습니다. 몇 가지 우려 사항이 있습니다.
    • 원본 파일의 크기가 다른 경우(아마도 귀하의 경우가 아닐 수 있음) 한 파일이 cmp다른 파일보다 더 넓은 첫 번째 열을 생성할 수 있습니다. 이후의 맥락에서 comm이것은 용납될 수 없습니다. 에 파이핑하여 출력을 "decolumnize"할 수 있습니다 awk '{print $1" "$2" "$3}'.
    • 출력이 "열화"되지 않은 경우(또는 "열화 해제"된 경우) comm파일이 정렬되지 않았다고 불평할 수 있습니다. 에 저장하기 전에 sort(가 아님 ) 이 필요합니다 . 이로 인해 다소 예상치 못한 순서가 발생할 수 있습니다(예: 다른 바이트 가 나타남) .sort -nchangesAB23~ 후에다른 바이트 ) 의 100453출력을 파이프로 연결하여 해결할 수 있습니다 .commsort -n
  • changes*파일이 엄청날 수 있습니다. 이는 중간적이고 일시적이므로 프로세스 대체가 좋은 접근 방식이 될 수 있습니다. 하지만 이것은 POSIX가 아닙니다.

    # Korn shell syntax example
    comm -12 <(cmp -l file1 file2) <(cmp -l file3 file2)
    
  • 관련 없는 변경 사항을 더 효과적으로 필터링하기 위해 의 출력을 comm또 다른 출력 및 또 다른 출력과 함께 사용할 수 있습니다 .cmp

    comm -12 changes12 changes32 > result1
    cmp -l file4 file5 | comm -12 - result1 > result2
    cmp -l file6 file5 | comm -12 - result2 > result3
    

    하지만 기억해:


선적 서류 비치:

답변2

저는 Windows 사용자이고 3개 파일(한 번에 2개)을 서로 비교하는 것을 포함하여 파일 비교를 위해 수년간 Beyond Compare를 사용해 왔습니다.

Beyond Compare에도 Linux 배포판이 있는 것 같으니 확인해 보시는 것이 좋을 것 같습니다.

https://www.scootersoftware.com/download.php?zz=kb_linux_install

Windows 버전에는 차이점만 표시하는 옵션과 도움이 될 수 있는 다른 많은 기능이 있다는 것을 알고 있습니다. 3방향 비교가 있는지 없는지 기억이 나지 않습니다.

나는 그 회사의 개발이나 판매 담당자가 아니며 단지 소프트웨어를 많이 좋아할 뿐입니다.

답변3

Kamil의 응답을 바탕으로 이를 사용하여 필요한 것을 얻었습니다.

cmp -l 파일1 파일2 | awk '{print $1" "$2" "$3}' | 정렬 > 변경_12

cmp -l 파일3 파일2 | awk '{print $1" "$2" "$3}' | 정렬 > 변경_32

comm -12 변경_12 변경_32 > common_changes

관련 정보