歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux文本比較命令:diff

Linux文本比較命令:diff

日期:2017/2/28 13:56:38   编辑:Linux教程

diff 命令是 Linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中打印每一個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程序,可以根據diff的輸出將a.c的文件內容更新為b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。

命令格式:

diff [參數][變動前的文件1或目錄1][變動後的文件2或目錄2]

命令功能:

diff命令能比較單個文件或者目錄內容。如果指定比較的是文件,則只有當輸入為文本文件時才有效。以逐行的方式,比較文本文件的異同處。如果指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件。

命令參數:

-y或--side-by-side  以並列的方式顯示文件的異同之處。

-W或--width  在使用-y參數時,指定欄寬。

-c  顯示全部內文,並標出不同之處。

-u,-U或--unified=  以合並的方式來顯示文件內容的不同。

-r或--recursive  比較子目錄中的文件。

-N或--new-file  在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。

-b或--ignore-space-change  不檢查空格字符的不同

-B或--ignore-blank-lines  不檢查空白行。

-H或--speed-large-files  比較大文件時,可加快速度。

-l或--ignore-matching-lines  若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異。

-i或--ignore-case  不檢查大小寫的不同。

-q或--brief  僅顯示有無差異,不顯示詳細的信息。

-r或--recursive  比較子目錄中的文件。

-s或--report-identical-files  若沒有發現任何差異,仍然顯示信息。

-S或--starting-file  在比較目錄時,從指定的文件開始比較

-t或--expand-tabs  在輸出時,將tab字符展開。

-T或--initial-tab  在每行前面加上tab字符以便對齊。

-w或--ignore-all-space  忽略全部的空格字符。

-v或--version  顯示版本信息。

實例

[root@linuxidc src]# cat a.txt
111
aaa
AAA
111aaa
aaa
AAA
111
[root@linuxidc src]# cat b.txt
111
aaa
AAA
111AAA
aaa
AAA
111
[root@linuxidc src]#

正常格式的diff如下

1 <span style='margin: 0px; padding: 0px; color: rgb(102, 102, 102); line-height: 26px; text-indent: 26px; font-family: "宋體", arial; font-size: 16px;'>[root@linuxidc src]# diff a.txt b.txt <br>4c4<br>< 111aaa<br>---<br>> 111AAA<br>[root@linuxidc src]#<br></span>

diff結果第一行“4c4”是一個提示,用來說明變動位置,前面的"4",表示f1的第4行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);後面的"4",表示變動後變成f2的第4行。

第二行“< 111aaa”,前面的小於號,表示要從f1當中去除該行(也就是第4行),後面的"111aaa"表示該行的內容。

第三行“---”用來分割f1和f2。

第四行“> 111AAA”,類似於第二行。前面的大於號表示f2增加了該行,後面的"111AAA"表示該行的內容。

上下文格式的diff如下

[root@linuxidc src]# diff -c a.txt b.txt
*** a.txt 2015-11-08 18:21:50.455124628 +0800
--- b.txt 2015-11-08 18:21:53.391173006 +0800
***************
*** 1,7 ****
111
aaa
AAA
! 111aaa
aaa
AAA
111
--- 1,7 ----
111
aaa
AAA
! 111AAA
aaa
AAA
111
[root@linuxidc src]#

第一部分顯示兩個文件的基本情況:文件名和時間信息,"***"表示變動前的文件,"---"表示變動後的文件。

第二部分#15個星號,將文件的基本情況與變動內容分割開。

第三部分顯示變動前的文件,即f1。這時不僅顯示發生變化的第4行,還顯示第4行的前面三行和後面三行,因此一共顯示7行。所以,前面的"*** 1,7 ****"就表示,從第1行開始連續7行。另外,文件內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感歎號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。

四部分顯示變動後的文件,即f2。

合並格式的diff

[root@linuxidc src]# diff -u a.txt b.txt
--- a.txt 2015-11-08 18:21:50.455124628 +0800
+++ b.txt 2015-11-08 18:21:53.391173006 +0800
@@ -1,7 +1,7 @@
111
aaa
AAA
-111aaa
+111AAA
aaa
AAA
111
[root@linuxidc src]#

第一部分,也是文件的基本信息。"---"表示變動前的文件,"+++"表示變動後的文件。

第二部分,變動的位置用兩個@作為起首和結束。前面的"-1,7"分成三個部分:減號表示第一個文件(即f1),"1"表示第1行,"7"表示連續7行。合在一起,就表示下面是第一個文件從第1行開始的連續7行。同樣的,"+1,7"表示變動後,成為第二個文件從第1行開始的連續7行。

第三部分是變動的具體內容。除了有變動的那些行以外,也是上下文各顯示3行。它將兩個文件的上下文,合並顯示在一起,所以叫做"合並格式"。每一行最前面的標志位,空表示無變動,減號表示第一個文件刪除的行,加號表示第二個文件新增的行。

並排格式輸出

[root@linuxidc src]# diff -y -W 50 a.txt b.txt
111 111
aaa aaa
AAA AAA
111aaa | 111AAA
aaa aaa
AAA AAA
111 111
[root@linuxidc src]#

“|”表示前後2個文件內容有不同

“<”表示後面文件比前面文件少了1行內容

“>”表示後面文件比前面文件多了1行內容

Copyright © Linux教程網 All Rights Reserved