
我有三個二進位(內存轉儲)。給他們打電話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
(十進制,編號以 開頭1
)由152
(八進位)變成112
(八進位)。
筆記:
cmp -l
在我的 Ubuntu 中「列化」它的輸出。這意味著它可以列印帶有前導空格的行,第一列的寬度取決於輸入大小。我想有些實現可能不會這樣做。有幾個問題:- 如果原始檔案的大小不同(可能不是您的情況),則一個檔案
cmp
可能會產生比另一個檔案更寬的第一列。在後來的背景下,comm
這是不可接受的。您可以透過管道傳輸到 來「取消列化」輸出awk '{print $1" "$2" "$3}'
。 - 如果輸出未「分欄」(或已「分欄」),
comm
可能會抱怨檔案未排序。在儲存到 之前您需要sort
(不需要) 。這可能會產生一些意想不到的順序(例如,會出現不同的位元組sort -n
changesAB
23
後不同的位元組100453
),可以透過管道傳輸comm
to的輸出來修復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 用戶,多年來一直使用 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 > 共同變化