
세 개의 바이너리 파일(메모리 덤프)이 있습니다. 그들에게 전화해라 file1
, file2
, file3
. 일부 소프트웨어를 디버깅하려고 하는데 스위치를 전환하고 있습니다.
file1
= 끄다file2
= 켜다file3
= 끄다
file1
와 사이에 어떤 바이트가 변경되었는지 알아야 하며 file2
, 그 다음에는 에서 동일한 값(과 file1
) 으로 다시 변경됩니다 file3
.
file1
사이 에는 관련되지 않은 변경 사항이 많이 있으므로 이 스위치를 전환할 때 변경 사항이 무엇인지 파악하는 것만으로 file2
는 충분하지 않습니다. , , ,… diff
에서 변경되는 고유한 엔트로피 바이트를 식별하려고 합니다.file1
2
3
xxd
, diff
, vimdiff
, 와 같은 도구가 있다는 것을 알고 있습니다 colordiff
. 이 문제에 어떻게 사용하는 것이 가장 좋은지 잘 모르겠습니다.
답변1
file1
및 file2
해당 값 사이에서 변경된 바이트를 확인하려면 다음을 사용하십시오 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 -n
changesAB
23
~ 후에다른 바이트 ) 의100453
출력을 파이프로 연결하여 해결할 수 있습니다 .comm
sort -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
하지만 기억해:
cmp
항상 같은 방향으로 움직여야 합니다 (예: 스위치를 끄고 켜는 것).- 다음 사항에 주의하세요.stdin 및 stdout과 동일한 파일을 사용하면 빈 파일이 생성됩니다..
… | comm -12 - result1 > result1
틀렸다.
선적 서류 비치:
답변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