Linux命令之diff

diff [選項] … [文件1或目錄1] [文件2或目錄2](四種組合方式)
說明:diff命令在最簡單的狀況下,比較兩個文件的不一樣。若是使用」-」代替文件參數,則要比較的內容未來自標準輸入。Diff命令是以逐行的方式比較文本文件的異同之處。若是指定比較的是目錄的時候,diff命令會比較兩個目錄下名字相同的文本文件,但不會比較其中子目錄。列出不一樣的二進制文件、公共子目錄和只在一個目錄出現的文件
(1).選項
-a,--text 把全部文件當作文本文件逐行比較
-b,--ignore-space-change 忽略空格產生的變化
-B,--ignore-blank-lines 忽略空白行的變化
-c,–C NUM,--context[=NUM] 使用上下文輸出格式(文件1在上,文件2在下,在差別點會標註出來),輸出NUM(默認3)行的上下文(上下各NUM行,不包括差別行)
-d,--minimal 使用不一樣的算法,努力尋找一個較小的變化集合。這會使diff變慢(有時更慢)
-D NAME,--ifdef=NAME 合併if-then-else格式輸出,預處理宏(由NAME參數提供)條件
-e,--ed 輸出一個ed格式的腳本文件
-E,--ignore-all-space 忽略因爲Tab擴展而致使的變化
-F RE,--show-function-line=RE 在上下文輸出格式(文件1在上,文件2在下)和統一輸出格式中,對於每一大塊的不一樣,顯示出匹配RE(regexp正則表達式)最近的行
-i,--ignore-case 忽略大小寫的區別
-I RE,--ignore-matching-lines=RE 忽略全部匹配RE(regexp正則表達式)的行的更改
-l,--paginate 經過pr編碼傳遞輸出,使其分頁
-n,--rcs 輸出RCS格式差別正則表達式

-N,--new-file 把缺乏的文件當作空白文件處理算法

-p,--show-c-function 顯示帶有C函數的變化vim

-q,--brief 僅輸出文件是否有差別,不報告詳細差別ide

-r,--recursive 當比較目錄時,遞歸比較全部找到的子目錄函數

-s,--report-identical-files 當兩個文件相同時報告this

-S FILE,--starting-file=FILE 在比較目錄時,從FILE開始。用於繼續中斷的比較編碼

-t,--expand-tabs 將輸出時擴展Tab轉換爲空格,保護輸入文件的tab對齊方式spa

-T,--initial-tab 經過預先設置的tab使選項卡對齊(???)3d

-u,-U NUM,--unified[=NUM] 使用統一輸出格式(輸出一個總體,只有在差別的地方會輸出差別點,並標註出來),輸出NUM(默認3)行的上下文(上下各NUM行,不包括差別行)regexp

-v,--version 輸出版本號

-w,--ignore-all-space 比較時忽略全部空格

-W NUM,--width=NUM 在並列輸出格式時,指定列的寬度爲NUM(默認130)

-x PAT,--exclude=PAT 排除與PAT(pattern樣式)匹配的文件

-X FILE,--exclude-from=FILE 排除與FILE中樣式匹配的文件

-y,--side-by-side 使用並列輸出格式

--from-file=FILE1 FILE1與全部操做對象比較,FILE1能夠是目錄

--help 輸出幫助信息

--horizon-lines=NUM 保留NUM行的公共前綴和後綴

--ignore-file-name-case 比較時忽略文件名大小寫

--label LABEL 使用LABEL(標識)代替文件名

--left-column (在並列輸出格式中)只輸出左列的公共行

--no- ignore-file-name-case 比較時考慮文件名大小寫

--normal 輸出一個正常的差別

--speed-large-files 假設文件十分大,並且有許多微小的差別

--strip-trailing-cr 去掉在輸入時尾隨的回車符

--suppress-common-lines 不輸出公共行

--to-file=FILE2 全部操做對象與FILE2比較,FILE2能夠是目錄

--unidiredtional-newfile 將缺乏的第一個文件視爲空文件

 

--GTYPE-group-format=GFMT 以GFMT格式化GTYPE輸入組

--line-format=LFMT 以LFMT格式化輸入全部行

--LTYPE-line-format=LFMT 以LFMT格式化LTYPE輸入行

LTYPE能夠是’old’,’new’或’unchanged’。GTYPE能夠是LTYPE選項或’changed’

       GFMT包括:

              %< 該行屬於FILE1

              %> 該行屬於FILE2

              %= 該行屬於FILE1和FILE2公共行

              %[-][WIDTH(寬度)][.[PREC(精確度)]]{doxX}LETTER(字母) printf格式規範LETTER。以下字母表示屬於新的文件,小寫表示屬於舊的文件:

                     F 行組中第一行的行號

                     L 行組中最後一行的行號

                     N 行數(=L-F+1)

                     E F-1

                     M L+1

       LFMT可包含:

              %L 該行內容

              %l 該行內容,但不包括尾隨的換行符

              %[-][WIDTH][.[PREC]]{doxX}n printf格式規範輸入行編號

       GFMT或LFMT可包含:

       %% %

%c’C’ 單個字符C

%c’\000’ 八進制000所表明的字符

(2).實例

在沒有任何參數時,diff命令比較

[root@CentOS6 桌面]# cat>t1.txt<<EOF
> this is a text!
> 
> Name is t1.txt!
> The extra content!
> I am MenAngel!
> EOF
[root@CentOS6 桌面]# cat> t2.txt    //第二種cat建文件方式,Ctrl+Z退出編輯
this is a text!      

Name is t2.txt!
^Z
[1]+  Stopped                 cat > t2.txt
[root@CentOS6 桌面]# diff t1.txt t2.txt
3,5c3    //文件1中的第3行到第5行(3,5)改成(c)文件2中的第3行(3),則兩個文件相同。
< Name is t1.txt!    //<表示FILE1的行
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!    //>表示FILE2的行

 以並列輸出格式展現兩個文件的不一樣

[root@CentOS6 桌面]# diff -y t1.txt t2.txt
this is a text!							this is a text!

Name is t1.txt!						      |	Name is t2.txt!
The extra content!					      <
I am MenAngel!						      <

 並列輸出格式下控制寬度

[root@CentOS6 桌面]# diff -y -W 40 t1.txt t2.txt
this is a text!		this is a text!

Name is t1.txt!	   |	Name is t2.txt!
The extra conten   <
I am MenAngel!	   <

 以上下文輸出格式展現兩個文件的不一樣

[root@CentOS6 桌面]# diff -c t1.txt t2.txt 
*** t1.txt	2018-06-23 21:44:15.171207940 +0800    //*表明t1.txt
--- t2.txt	2018-06-23 21:44:54.987207910 +0800    //-表明t2.txt
***************
*** 1,5 ****    //從第1行到第5行
  this is a text!
  
! Name is t1.txt!    //!標註差別行
! The extra content!
! I am MenAngel!
--- 1,3 ----    //從第1行到第3行
  this is a text!
  
! Name is t2.txt!

以統一輸出格式展現兩個文件的不一樣

[root@CentOS6 桌面]# diff -u t1.txt t2.txt 
--- t1.txt	2018-06-23 21:44:15.171207940 +0800    //-表明t1.txt
+++ t2.txt	2018-06-23 21:44:54.987207910 +0800    //+表明t2.txt
@@ -1,5 +1,3 @@    //t1.txt第1行到第5行,t2.txt第1行到第3行
 this is a text!
 
-Name is t1.txt!    //-表明前面的文件比後面的文件多一行,+表明後面的文件比前面的文件多一行,通常一一對應
-The extra content!
-I am MenAngel!
+Name is t2.txt!

 文件交換對比位置所帶來的差距

[root@CentOS6 桌面]# diff -y -W 40 t2.txt t1.txt 
this is a text!		this is a text!

Name is t2.txt!	   |	Name is t1.txt!
		   >	The extra conten
		   >	I am MenAngel!
[root@CentOS6 桌面]# diff -c t2.txt t1.txt 
*** t2.txt	2018-06-23 21:44:54.987207910 +0800
--- t1.txt	2018-06-23 21:44:15.171207940 +0800
***************
*** 1,3 ****
  this is a text!
  
! Name is t2.txt!
--- 1,5 ----
  this is a text!
  
! Name is t1.txt!
! The extra content!
! I am MenAngel!
[root@CentOS6 桌面]# diff -u t2.txt t1.txt 
--- t2.txt	2018-06-23 21:44:54.987207910 +0800
+++ t1.txt	2018-06-23 21:44:15.171207940 +0800
@@ -1,3 +1,5 @@
 this is a text!
 
-Name is t2.txt!
+Name is t1.txt!
+The extra content!
+I am MenAngel!

目錄與目錄間的比較

[root@CentOS6 桌面]# mkdir dir1 dir2
[root@CentOS6 桌面]# cd dir1
[root@CentOS6 dir1]# cat>text1<<EOF
> dir:dir1
> name:text1
> 
> Total 4!
> EOF
[root@CentOS6 dir1]# cat>text2<<EOF
> I am MenAngel!
> I am studying the order of Linux!
> EOF
[root@CentOS6 dir1]# cd ../dir2
[root@CentOS6 dir2]# cat>text1<<EOF
> dir:dir2
> name:text1
> 
> 
> Total 5!
> EOF
[root@CentOS6 dir2]# cat>text3<<EOF
> Working hard makes success!
> I am MenAngel!
> EOF
[root@CentOS6 dir2]# cd ../
[root@CentOS6 桌面]# diff dir1 dir2
diff dir1/text1 dir2/text1    //有相同文件名時自動比較
1c1
< dir:dir1
---
> dir:dir2
4c4,5
< Total 4!
---
> 
> Total 5!
Only in dir1: text2    //只有dir1存在text2
Only in dir2: text3    //只有dir2存在text3

 生成log文件,diff的輸出文件被稱爲補丁(patch),可使用patch命令將文件內容更新

[root@CentOS6 桌面]# diff dir1 dir2>dir.log
[root@CentOS6 桌面]# cat dir.log
diff dir1/text1 dir2/text1
1c1
< dir:dir1
---
> dir:dir2
4c4,5
< Total 4!
---
> 
> Total 5!
Only in dir1: text2
Only in dir2: text3
[root@CentOS6 桌面]# diff t1.txt t2.txt >t12.log
[root@CentOS6 桌面]# cat t12.log 
3,5c3
< Name is t1.txt!
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!

(3).擴展

vimdiff也能夠比較文件

[xf@xuexi ~]$ vimdiff 1.txt 2.txt 
還有 2 個文件等待編輯

顯示以下狀況,退出編輯能夠參考vim

相關文章
相關標籤/搜索