linux每日命令(33):diff命令
閱讀目錄(Content)
- 一. 命令格式
- 二.命令功能
- 三. 命令參數
- 四. 使用實例
- 1. 比較兩個文件
- 2. 並排格式輸出
- 3. 上下文格式輸出
- 4. 統一格式輸出
- 5. 比較文件夾不同
- 6. 比較兩個文件不同,並生產補丁
- 7. 打補丁
diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中打印每一個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程序,可以根據diff的輸出將a.c的文件內容更新為b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。
一. 命令格式
diff [參數] [文件1或目錄1] [文件2或目錄2]
二.命令功能
diff命令能比較單個文件或者目錄內容。如果指定比較的是文件,則只有當輸入為文本文件時才有效。以逐行的方式,比較文本文件的異同處。
如果指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件。
三. 命令參數
參數 | 描述 |
---|---|
-行數 | 指定要顯示多少行的文本。此參數必須與-c或-u參數一並使用。 |
-a | 或--text ,diff預設只會逐行比較文本文件。 |
-b | 或--ignore-space-change ,不檢查空格字符的不同。 |
-B | 或--ignore-blank-lines ,不檢查空白行。 |
-c | 顯示全部內文,並標出不同之處。 |
-C行數 | 或--context行數 與執行"-c-行數"指令相同。 |
-d | 或--minimal , 使用不同的演算法,以較小的單位來做比較。 |
-D | 或ifdef , 此參數的輸出格式可用於前置處理器巨集。 |
-e | 或--ed , 此參數的輸出格式可用於ed的script文件。 |
-f | 或-forward-ed ,輸出的格式類似ed的script文件,但按照原來文件的順序來顯示不同處。 |
-H | 或--speed-large-files , 比較大文件時,可加快速度。 |
-l | 或--ignore-matching-lines ,若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異。 |
-i | 或--ignore-case ,不檢查大小寫的不同。 |
-l | 或--paginate ,將結果交由pr程序來分頁。 |
-n | 或--rcs ,將比較結果以RCS的格式來顯示。 |
-N | 或--new-file ,在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。 |
-p | 若比較的文件為C語言的程序碼文件時,顯示差異所在的函數名稱。 |
-P | 或--unidirectional-new-file ,與-N類似,但只有當第二個目錄包含了一個第一個目錄所沒有的文件時,才會將這個文件與空白的文件做比較。 |
-q | 或--brief , 僅顯示有無差異,不顯示詳細的信息。 |
-r | 或--recursive ,比較子目錄中的文件。 |
-s | 或--report-identical-files, 若沒有發現任何差異,仍然顯示信息。 |
-S | 或--starting-file , 在比較目錄時,從指定的文件開始比較。 |
-t | 或--expand-tabs ,在輸出時,將tab字符展開。 |
-T | 或--initial-tab ,在每行前面加上tab字符以便對齊。 |
-u | ,-U或--unified= , 以合並的方式來顯示文件內容的不同。 |
-v | 或--version , 顯示版本信息。 |
-w | 或--ignore-all-space , 忽略全部的空格字符。 |
-W | 或--width , 在使用-y參數時,指定欄寬。 |
-x | 或--exclude , 不比較選項中所指定的文件或目錄。 |
-X | 或--exclude-from , 您可以將文件或目錄類型存成文本文件,然後在=中指定此文本文件。 |
-y | 或--side-by-side ,以並列的方式顯示文件的異同之處。 |
--help | 顯示幫助。 |
--left-column | 在使用-y參數時,若兩個文件某一行內容相同,則僅在左側的欄位顯示該行內容。 |
--suppress-common-lines 在使用-y參數時,僅顯示不同之處。 |
四. 使用實例
1. 比較兩個文件
命令:
diff 2.log 1.log
輸出:
[root@localhost test]# cat 1.log 第一行 第二行 我是log1第3行 第四行 第五行 第六行 [root@localhost test]# cat 2.log 第一行 第二行 我是log2第3行 第四行 [root@localhost test]# diff 2.log 1.log 3c3 < 我是log2第3行 --- > 我是log1第3行 4a5,6 > 第五行 > 第六行
說明:
上面的"3c3"表示1.log和2.log文件在3行內容有所不同;"4a5,6"表示第2個文件比第1個文件多了第5和6行。
diff 的normal 顯示格式有三種提示:
a - add
c - change
d - delete
2. 並排格式輸出
命令:
diff 2.log 1.log -y -W 50
輸出:
[root@localhost test]# diff 2.log 1.log -y -W 50 第一行 第一行 第二行 第二行 我是log2第3行 | 我是log1第3行 第四行 第四行 > 第五行 > 第六行
[root@localhost test]# diff 1.log 2.log -y -W 50 第一行 第一行 第二行 第二行 我是log1第3行 | 我是log2第3行 第四行 第四行 第五行 < 第六行 <
說明:
“|”表示前後2個文件內容有不同
“<”表示後面文件比前面文件少了1行內容
“>”表示後面文件比前面文件多了1行內容
3. 上下文格式輸出
命令:
diff 2.log 1.log -c
輸出:
[root@localhost test]# diff 2.log 1.log -c *** 2.log 2018-12-03 10:21:24.914596171 +0800 --- 1.log 2018-12-03 10:22:30.922589959 +0800 *************** *** 1,4 **** 第一行 第二行 ! 我是log2第3行 第四行 --- 1,6 ---- 第一行 第二行 ! 我是log1第3行 第四行 + 第五行 + 第六行 [root@localhost test]# diff 1.log 2.log -c *** 1.log 2018-12-03 10:22:30.922589959 +0800 --- 2.log 2018-12-03 10:21:24.914596171 +0800 *************** *** 1,6 **** 第一行 第二行 ! 我是log1第3行 第四行 - 第五行 - 第六行 --- 1,4 ---- 第一行 第二行 ! 我是log2第3行 第四行
說明:
這種方式在開頭兩行作了比較文件的說明,這裏有三中特殊字符:
“+” 比較的文件的後者比前著多一行
“-” 比較的文件的後者比前著少一行
“!” 比較的文件兩者有差別的行
4. 統一格式輸出
命令:
diff 2.log 1.log -c
輸出:
[root@localhost test]# diff 2.log 1.log -u --- 2.log 2018-12-03 10:21:24.914596171 +0800 +++ 1.log 2018-12-03 10:22:30.922589959 +0800 @@ -1,4 +1,6 @@ 第一行 第二行 -我是log2第3行 +我是log1第3行 第四行 +第五行 +第六行
說明:
它的第一部分,也是文件的基本信息:
--- 2.log 2018-12-03 10:21:24.914596171 +0800
+++ 1.log 2018-12-03 10:22:30.922589959 +0800
"---"表示變動前的文件,"+++"表示變動後的文件。
第二部分,變動的位置用兩個@作為起首和結束。
@@ -1,4 +1,6 @@
前面的"-1,4"分成三個部分:減號表示第一個文件(即2.log),"1"表示第1行,"4"表示連續4行。合在一起,就表示下面是第一個文件從第1行開始的連續4行。同樣的,"+1,6"表示變動後,成為第二個文件從第1行開始的連續6行。
5. 比較文件夾不同
命令:
diff test test2
輸出:
[root@localhost hc]# ls test 1.log 2.log 2.log.back [root@localhost hc]# ls test2 1.log 2.log [root@localhost hc]# diff test test2 diff test/1.log test2/1.log 5,6d4 < 第五行 < 第六行 diff test/2.log test2/2.log 4c4,5 < 第四行 --- > 第四行1 > 第五行 Only in test: 2.log.back
6. 比較兩個文件不同,並生產補丁
命令:
diff -ruN 2.log.back 2.log > patch.log
輸出:
[root@localhost test]# cat 2.log 第一行 第二行 我是log2第3行 第四行 [root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 [root@localhost test]# diff -ruN 2.log.back 2.log > patch.log [root@localhost test]# ll total 16 -rw-r--r-- 1 root root 68 12月 3 10:22 1.log -rw-r--r-- 1 root root 48 12月 3 10:21 2.log -rw-r--r-- 1 root root 38 12月 3 11:06 2.log.back -rw-r--r-- 1 root root 165 12月 3 11:06 patch.log [root@localhost test]# cat patch.log --- 2.log.back 2018-12-03 11:06:25.587342012 +0800 +++ 2.log 2018-12-03 10:21:24.914596171 +0800 @@ -1,3 +1,4 @@ 第一行 第二行 我是log2第3行 +第四行
7. 打補丁
命令:
patch 2.log.back patch.log
輸出:
[root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 [root@localhost test]# patch 2.log.back patch.log patching file 2.log.back [root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 第四行
linux每日命令(33):diff命令