如何比較三個二進位檔案以僅顯示 1 和 2 之間更改的內容,然後在 2 和 3 之間更改回來的內容?

如何比較三個二進位檔案以僅顯示 1 和 2 之間更改的內容,然後在 2 和 3 之間更改回來的內容?

我有三個二進位(內存轉儲)。給他們打電話file1file2file3。我正在嘗試調試一些軟體,並且正在切換開關。

  • file1= 關閉

  • file2= 開啟

  • file3= 關閉

我需要知道file1和之間哪些位元組發生了變化file2,然後又變回了file1與 中相同的值(與 )file3

之間有很多不相關的變化file1file2因此diff僅憑這一點還不足以讓我確定切換此開關時發生的變化,我試圖識別從file123、…變化的熵的獨特字節。

我知道有諸如xxd、、、diffvimdiff類的工具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(十進制,編號以 開頭1)由152(八進位)變成112(八進位)。


筆記:

  • cmp -l在我的 Ubuntu 中「列化」它的輸出。這意味著它可以列印帶有前導空格的行,第一列的寬度取決於輸入大小。我想有些實現可能不會這樣做。有幾個問題:
    • 如果原始檔案的大小不同(可能不是您的情況),則一個檔案cmp可能會產生比另一個檔案更寬的第一列。在後來的背景下,comm這是不可接受的。您可以透過管道傳輸到 來「取消列化」輸出awk '{print $1" "$2" "$3}'
    • 如果輸出未「分欄」(或已「分欄」),comm可能會抱怨檔案未排序。在儲存到 之前您需要sort(不需要) 。這可能會產生一些意想不到的順序(例如,會出現不同的位元組sort -nchangesAB23不同的位元組100453),可以透過管道傳輸commto的輸出來修復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
    

    但要記住:


文件:

答案2

我是 Windows 用戶,多年來一直使用 Beyond Compare 進行檔案比較,包括相互比較 3 個檔案(一次 2 個)。

Beyond Compare 似乎也有一個 Linux 發行版,所以你可能會想看看。

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

我知道 Windows 版本具有僅顯示差異的選項,以及許多可能對您有幫助的其他功能。我不記得他們是否有三向比較。

我不是他們的開發人員或銷售人員,我只是非常喜歡這個軟體。

答案3

根據卡米爾的回复,我用它來得到我需要的東西:

cmp -l 文件1 文件2 | awk '{print $1" "$2" "$3}' |排序>changes_12

cmp -l 文件3 文件2 | awk '{print $1" "$2" "$3}' |排序>changes_32

通訊 -12 變化_12 變化_32 > 共同變化

相關內容