cmp 命令:比較任意兩個類型的文件,且吧結果輸出到標准輸出,默認文件相同不輸出,不同的文件輸出差異
必要參數
-c 顯示不同的信息
-l 列出所有的不同信息
-s 錯誤信息不提示
選擇參數
-i<字符數> 指定字符數目
-v 顯示版本信息
--help 顯示幫助信息
【函數的返回值】
0 :文件時同樣的
1 :文件是不同的
>1:發生錯誤
comm將逐行比較已經排序的兩個文件。顯示結果包括3列:
第1列為只在file1中找到的行;第2列為只在file2中找到的行;第3列為兩個文件的公用行。
參數
參數file1和file2為comm要比較的文件的路徑名。用連字符(-)來替代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 -y -W 50
“|”表示前后2個文件內容有不同
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倒序,此方法輸出的結果,發現都是不正確的。