看懂diff的結果

2021-08-15 17:05:44 字數 3140 閱讀 7762

diff是個用的比較多的東西,只要支援就還是很好用的東西,這篇部落格就是記錄一下如何看懂diff的結果。

diff有三種格式:

正常格式

上下文格式

合併格式

為了方便理解這裡建立兩個檔案a.txt,b.txt

a.txt:

1234567

abcdefg

b.txt:

1234567

abcdefg

如果兩個檔案是沒有區別的,那麼一般是不會有輸出的。

依次來看各種模式間的區別,已經每種輸出的意義。

正常格式:

$ diff a.txt b.txt
這時diff正常格式的輸出結果如下(由四塊組成):

2,4c2,5

---

第一行表明了變動位置(第一塊)。2,4c2,5。它由三個部分組成:前面的2,4表明a.txt的2-4行有變化;

後面的2,5表明改動後變成b.txt的2-5行。

然後後面共三行(第二塊):

每行由兩部分組成:< 內容。

前面的左尖括號(<)表示要從a.txt中刪除改行,改行的內容是什麼。每行對應一行輸出。

然後再是一行 ---(第三塊),這個沒有特殊意義,只是起到乙個分隔作用。

然後後面有四行(第四塊):

和前面的第二塊比較相似,前面的右尖括號(>)表明要在b.txt中追加這行,這行的內容是什麼,每行對應一行輸出。

上下文格式:

$ diff -c a.txt b.txt
與正常格式相比只是新增了個引數c(context)。

這時的輸出內容如下:

*** a.txt       2018-02-21 19:12:36.548904412 +0800

--- b.txt 2018-02-21 19:14:53.986702916 +0800

***************

*** 1,5 ****

1234567

abcdefg

--- 1,6 ----

1234567

abcdefg

這個結果也是四塊。

第一塊由前面兩行組成,顯示兩個檔案的基本情況:比如檔名和時間。

*** a.txt       2018-02-21 19:12:36.548904412 +0800

--- b.txt 2018-02-21 19:14:53.986702916 +0800

第二塊是15個星號組成。同樣是起分割作用。

第三塊是顯示變動前的檔案內容,即a.txt。

*** 1,5 ****

1234567

abcdefg

這時不僅是變化的那幾行會顯示出來還會額外顯示一部分,注意不要看這裡是全部列印了就以為全部顯示,

其實只顯示變化了的前三行和後三行,這裡因為內容比較少所以全部列印了,讀者可以自己去嘗試看看效果。

這上三行和下三行其實就是所謂的上下文了。

這一塊也比較好理解,前面第一行也是變動的位置,然後每一行前面有乙個空標記如果為空,則表示沒有變動,

如果為感嘆號(!)則表示發生了變化,如果為加號(+)則表示改行為新增行,如果為減號(-)則表示改行被刪除。

第四塊就是變動後的檔案內容,即b.txt。

--- 1,6 ----

1234567

abcdefg

每行意義和第三塊差不多,應該好理解。

合併格式:

如果兩個檔案相似度較高,那麼上下文格式會有大量重複內容,所以又引入了合併格式。

$ diff -u a.txt b.txt
使用方法為新增u(unified)引數。

此時列印結果如下:

--- a.txt       2018-02-21 19:12:36.548904412 +0800

+++ b.txt 2018-02-21 19:14:53.986702916 +0800

@@ -1,5 +1,6 @@

1234567

abcdefg

前面兩行和上下文一樣是檔案相關資訊。下面列印出來的內容也和上下文差不多,

除了有變動的內容以外,也是多列印上三行和下三行,但是它將兩個檔案內容合併在一起顯示,所以叫"合併格式"。

每一行最前的仍是標準位:空表示無變動,減號表示第乙個檔案刪除的行,加號表示第二個檔案新增的行。

這些和上下文格式都差不多,主要新增的區別是中間那部分,被@@夾著的內容。

前面-1,5分成三個部分:減號表示第乙個檔案(即a.txt),1表示第一行,5表示連續5行。合併在一起,就表示下面是

第乙個檔案從第一行開始的連續5行。同樣的後面的+1,6表示下面是第二個檔案從第一行開始的連續6行。

注意前面兩種格式的m,n都是從第m行到第n行,而這裡是從第m行開始的連續n行。

git格式的diff:

版本管理系統git使用的是合併格式diff的變體。

$ git diff
顯示結果如下:

diff --git a/a.txt b/b.txt

index 2b875e9..4636b73 100644

--- a/a.txt

+++ b/b.txt

@@ -1,5 +1,6 @@

1234567

abcdefg

第一行表示結果為git的diff。進行比較的是:a版本的a.txt(即變動前)和b版本的b.txt(即變動後)。

第二行表示兩個版本的git雜湊值(index區域的2b875e9物件,與工作目錄區域的4636b73物件進行比較),

最後六位數是物件的模式(普通檔案,644許可權)。

第三行~第四行表示進行比較的兩個檔案。"---"表示變動前,"+++"表示變動後。

後面的行和合併格式的diff都一樣。

參考文獻:讀懂diff 

如何看懂NCBI BLAST輸出結果

解讀報告前需要掌握的概念 alignments 代表比對上的兩個序列 hits 表示兩個序列比對上的片段 score 比對得分,如果序列匹配上得分,不一樣,減分,分值越高,兩個序列相似性越高 e value 值越小,越可信,相對的乙個統計值。length 輸入序列的長度 identities 一致性...

diff程式的演算法

diff程式很重要,linux中的源 補丁都是diff作出來的,diff在比較兩個文字檔案的不同方面很高效,它是基於行的,diff會將兩個檔案都按照行分成若干部分,然後計算這些行每一行的校驗碼,之後的問題就是比較這兩個檔案的所有行的校驗碼序列的不同了,這就把問題歸結為了序列比對,diff用的是動態規...

Diff的簡單使用

感謝原作者分享!linux的diff功能很強大 diff options oldfile dir newfile dir 常用的選項有 r 比較目錄 u 將差異的檔案輸出到檔案中 例如 diff ru file one file two file diff.diff patch p1 oldhell...