diff 命令詳解

1.概述

本文將要討論的是diff命令,diff用來比較兩個文件。固然文件比較的工具不少,windows系統下面就有不錯的工具可使用,例如經常使用的Beyond Compare,WinMerge都是圖形界面的比較工具並且使用很是方便,若是你僅僅是在windows下工做,這些GUI的比較工具絕對是首選。對於在linux環境下工做的人來講,若是每次想看兩個文件的區別都要將文件下載到windows環境而後用圖形工具進行比較實在是太麻煩了。那麼咱們必須學會使用linux環境下的比較工具diff。spa

2.diff如何工做,如何理解diff的執行結果

diff分析兩個文件,並輸出兩個文件的不一樣的行。diff的輸出結果代表須要對一個文件作怎樣的操做以後才能與第二個文件相匹配【或者這麼理解:與第一個文件相比,第二個文件發生了那些變化】【git diff的結果輸出也是如此。diff並不會改變文件的內容,可是diff能夠輸出一個ed腳原本應用這些改變。
如今讓咱們來看一下diff是如何工做的,假設有兩個文件:命令行

//file1.txt
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.

//file2.txt
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.3d

咱們使用diff比較他們的不一樣:
diff file1.txt file2.txtorm

輸出以下結果:
2,4c2,4
< I need to run the laundry.
< I need to wash the dog.
< I need to get the car detailed.
---
> I need to do the laundry.
> I need to wash the car.
> I need to get the dog detailed.

咱們來講明一下該輸出結果的含義,要明白diff比較結果的含義,咱們必須牢記一點,diff描述兩個文件不一樣的方式是告訴咱們怎麼樣改變第一個文件以後與第二個文件匹配。咱們看看上面的比較結果中的第一行 2,4c2,4 前面的數字2,4表示第一個文件中的行,中間有一個字母c表示須要在第一個文件上作的操做(a=add,c=change,d=delete),後面的數字2,4表示第二個文件中的行。

2,4c2,4 的含義是:第一個文件中的第[2,4]行(注意這是一個閉合區間,包括第2行和第4行)須要作出修改才能與第二個文件中的[2,4]行相匹配。
接下來的內容則告訴咱們須要修改的地方,前面帶 < 的部分表示左邊文件的第[2,4]行的內容,而帶> 的部分表示右邊文件的第[2,4]行的內容,中間的 --- 則是兩個文件內容的分隔符號。

3.Normal模式

上面的部分咱們說明了如何查看diff命令的結果,實際上對於上面的比較,咱們使用的是diff命令的Normal模式,這也是diff命令的默認模式,也就是說diff兩個文件的時候若是不加模式參數則是默認模式進行比較,其效果與(--normal)同樣,咱們舉一些例子來講明Normal模式下的輸出結果(前面已經說明了一種比較結果),爲了直觀查看兩個文件的不一樣我在windows下面經過BeyondCompare工具列出兩個文件的不一樣,而截圖下面的黑色部分則是diff的比較輸出截圖。

第一個文件比第二個文件少了行的狀況:

第一個文件比第二個文件多出行的狀況:

2

第一個文件與第二個文件不相同的狀況:

3

以上diff命令執行的時候沒有指定額外的模式參數,因此其使用的是默認的Normal模式,效果與添加命令行參數--normal 是同樣的。

4.Context模式

默認狀況下的模式輸出結果其實是符合計算機的思惟方式,不太直觀,因此其輸出結果並不可以很好的被人理解,diff命令除了默認模式以外還提供了另外兩種模式,Context和Unified模式,本節咱們說說如何查閱Context模式下的輸出結果。diff命令應用Context模式只須要添加命令行參數 diff -c  便可,咱們先看看兩個案例文件:

33

接下來講明這兩個文件以diff  -c 方式比較的結果:

3

5.Unified模式

diff還有一種比較方式,也即Unified模式,使用命令行 –u 來執行該模式的比較。其比較結果與Context模式很像,可是簡化了一些輸出,咱們看看咱們的案例文件,與上面的同樣:

3

使用diff –u 比較的結果:

3

能夠看到其比較結果與Context模式實際上差很少,只不過將比較結果合併到一塊兒了。

6.比較目錄

使用diff能夠比較兩個目錄,其比較格式是  diff  directory1  directory2 查看以下目錄比較結果:

3

比較兩個目錄的時候無非是有的文件僅僅存在於某個目錄中而在另外一個目錄中沒有,若是存在同名的文件,則比較這兩個文件的不一樣。diff比較目錄的結果咱們能夠結合grep命令篩選出咱們想要的輸出,例如僅僅輸出兩個目錄下不一樣的文件而忽略掉某一個目錄獨有另外一個目錄不存在的輸出記錄。

7.一些有用的參數

diff還提供了一些有用的參數來控制比較行爲與輸出結果,一些經常使用的參數以下:
-b  --ignore-space-change 忽略空格,若是兩行進行比較,多個連續的空格會被看成一個空格處理,同時會忽略掉行尾的空格差別。
-w --ignore-all-space 忽略全部空格,忽略範圍比-b更大,包括不少不可見的字符都會忽略。
-B 忽略空白行。
-y  輸出兩列,一個文件一列,有點相似GUI的輸出外觀了,這種方式輸出更加直觀。
-W 大寫W,當指定-y的時候設置列的寬度,默認是130
-x, --exclude=PAT 比較目錄的時候排除指定PAT模式的文件名的比較
-i, --ignore-case 忽略兩個文件中大小寫的不一樣
-e 將比較的結果保存成一個ed腳本,以後ed程序能夠執行該腳本文件,從而將file1修改爲與file2的內容相同,這通常在patch的時候有用。

diff  -e  1.txt  2.txt  > script.txt
這樣就是生成了一個ed能夠執行的腳本文件script.txt,生成腳本文件以後咱們還須要作一個操做, 在腳本文件末尾添加ed的write指令,只須要執行 echo "w" >>script.txt 將w指令附加到腳本文件的最後一行便可。
那麼如何應用該腳本文件呢,能夠這樣使用:
ed  -  1.txt < script.txt 
注意中間的 – 符號表示從標準輸入中讀取,而 < script.txt 則重定向script.txt的內容到標準輸入。這樣執行以後1.txt的內容將與2.txt徹底相同。

相關文章
相關標籤/搜索