linux比較兩個文件的不同(6/21)


cmp 命令:比較任意兩個類型的文件,且吧結果輸出到標准輸出,默認文件相同不輸出,不同的文件輸出差異

必要參數

-c 顯示不同的信息
-l 列出所有的不同信息
-s 錯誤信息不提示
 選擇參數

-i<字符數> 指定字符數目
-v 顯示版本信息
--help 顯示幫助信息

【函數的返回值】

0 :文件時同樣的
1 :文件是不同的
>1:發生錯誤

comm將逐行比較已經排序的兩個文件。顯示結果包括3列:

第1列為只在file1中找到的行;第2列為只在file2中找到的行;第3列為兩個文件的公用行。

 參數

參數file1file2comm要比較的文件的路徑名。用連字符(-)來替代file1或者file2時,comm將從標准輸入讀取輸入信息

 選項

-1              不顯示第1列(即不顯示只在file1中找到的行)

-2              不顯示第2列(即不顯示只在file2中找到的行)

-3              不顯示第3列(即不顯示在兩個文件中都找到的行)

 注意

如果文件沒有排序,comm就不能正常的工作

第2列的沒一行前面有一個制表符,第3列中的每一行前面有兩個制表符

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

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

3.命令參數:

-  指定要顯示多少行的文本。此參數必須與-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參數時,僅顯示不同之處。

比較后的不同之處以指定的形式列出,如下所示:

n1 a n3,n4  
n1,n2 d n3  
n1,n2 c n3,n4 

其中,字母"a"、"d"、"c"分別表示添加、刪除及修改操作。而"n1"、"n2"表示在文件1中的行號,"n3"、"n4"表示在文件2中的行號。

注意:以上說明指定了兩個文件中不同處的行號及其相應的操作。在輸出形式中,每一行后面將跟隨受到影響的若干行。其中,以<開始的行屬於文件1,以>開始的行屬於文件2。

11,12d10″表示第一個文件比第二個文件多了第11和12行。

diff log2013.log log2014.log  --50

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

 
<”表示后面文件比前面文件少了1行內容
 
>”表示后面文件比前面文件多了1行內容

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

diff log2014.log log2013.log  -u

--log2014.log 2012-12-07 18:01:54.000000000 +0800
 
++log2013.log 2012-12-07 16:36:26.000000000 +0800

“—“表示變動前的文件,”+++”表示變動后的文件。

diff log2013.log log2014.log  -c

 

 

2
3
4
5
“+” 比較的文件的后者比前着多一行
 
“-” 比較的文件的后者比前着少一行
 
“!” 比較的文件兩者有差別的行

comm命令的參數

-1 不顯示只在第1個文件里出現過的列。 -2 不顯示只在第2個文件里出現過的列。 -3 不顯示只在第1和第2個文件里出現過的列。

comm命令是一個非常簡潔的命令,其只有兩個參數。不過三個參數也結常要組合使用,我們常用的用法如下:

comm - 12 就只顯示在兩個文件中都存在的行; comm - 23 只顯示在第一個文件中出現而未在第二個文件中出現的行; comm - 123 則什么也不顯示。

comm找出文件2中有,文件1中沒有的行:

cat /etc/dhcpd.conf|grep "fixed-address"|grep -v ^#|awk '{print $NF}'|sed 's/;//g'|sort > /tmp/1.txt arp -n|grep ether|grep -v eth0|awk '{ print $1}'|sort >/tmp/2.txt comm -23 2.txt 1.txt

注:兩個文件的內容在比較前,一定要進行sort排序。不然輸出的結果將是錯誤的。

方法二:diff命令比較

diff命令是一個比較經典的文本比較工具了,diff命令較comm的參數要多。其經常和patch命令組合使用,進行補丁升級。其默認使用的是-a參數,即逐行比較兩個文件之間的不同。此處我們要實現想要得到的結果,還需要配合grep和awk實用:

diff 2.txt 1.txt |grep "<"|awk ' $1 = " " '

注:此處也發現,在使用diff命令進行比較時,也需要預先對經比較的文件進行sort排序,不然輸出的結果同樣是不正確的。

方法三:awk實現

awk應該算是shell常用命令中的泰山北斗了,幾乎很多其他命令能完成的工作,awk都能完成(只不過有些寫起來可能比較復雜)。本例中也不例外:

awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' 1.txt 2.txt

找出兩個文件之間的相同部分可以使用

awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]' 1.txt 2.txt

 

下面的兩個語句也可以換成:

awk  'NR==FNR{a[$0]}NR>FNR{ if(!($1 in a)) print $0}' file1 file2 找出文件2中不同的值 awk 'NR==FNR{a[$0]}NR>FNR{ if($1 in a) print $0}' file1 file2 找出兩文件中相同的值

 

注:

1、awk實現時,並不需要事先對兩個文件進行sort排序,

2、注意和上兩個命令中兩個文件的放置順序是不同的。三種實現方法,文件的順序一定顛倒,顛倒了,效果就剛好想反了,就變成找出文件1中有文件2中沒有的行了。

方法四:grep誤人子弟法

網上另外流傳一個錯誤的方法,即通過grep命令實現:

grep -v -f 1.txt 2.txt

經測試,無論我事先是否對兩個文件進行sort倒序,此方法輸出的結果,發現都是不正確的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM