linux每日命令(33):diff命令

来源:https://www.cnblogs.com/huchong/archive/2018/12/03/10057353.html
-Advertisement-
Play Games

diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中列印每一個行的改動。最新版本的diff還支持二進位文件。diff程式的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出將 ...


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行
第四行

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [root@localhost ~]# ifconfig bond0:0 10.0.0.202 netmask 255.255.255.255 broadcast 10.0.0.255 up 摘自:http://www.wangxuejin.cn/post-247.html ...
  • 1.打開任務管理器切換到啟動Tab,在需要刪除的項目上點擊右鍵,點擊打開文件所在位置,這樣就找到了啟動項所在磁碟位置,可以根據需要決定是否刪除。 2.從註冊表中刪除在啟動中的註冊信息。 regedit 打開註冊表後,將註冊表定位於 \HKEY_LOCAL_MACHINE\SOFTWARE\Wow64 ...
  • 最近瀏覽博客的時候,經常會看到博主展示出自己的公鑰,於是對 GPG/PGP 產生興趣。下麵簡單記錄相關文章的鏈接,方便以後瞭解。 簡介: 1991年,程式員Phil Zimmermann為了避開政府的監視,開發了加密軟體PGP。因為這個軟體非常好用,迅速流傳開來成為許多程式員的必備工具。但是,它是商 ...
  • 1、定義方式:在[]內用逗號分隔開多個任意類型的值l l=['a','b','c'] l=list(['a','b','c']) ​ 類型轉換 l=list('hello') l=list({'x':1,'y':2}) print(l) ​ 2,常用操作+內置的方法 同字元串相似 ​ (1),追加& ...
  • 1. Method 請求方法,表明客戶端希望伺服器對資源執行的動作; 1.1 GET 向伺服器請求資源。 1.2 HEAD 和GET方法的行為類似,但伺服器在響應中只返迴首部,不會返回實體的主體部分。這就允許客戶端在未獲取實際資源的情況下,對資源的首部進行檢查。 可以做到: 不獲取資源的情況下瞭解資 ...
  • 【通用命令】 1.創建文件夾 mkdir -p xxx 2.解壓包 tar -zxvf xxxx.tar.gz 3.縮文件 tar zcvf 壓縮包名稱.tar.gz 要壓縮的文件 4.動命令 mv 文件 移動到的位置 5添加服務 chkconfig --ad 6賦權 chmod -R 777 xx ...
  • 忘記root密碼 如果不小心忘記了root密碼,那麼mysql就不能再登錄了,這時就要重置root密碼才行。通過下麵的步驟,我們可以重新設置root密碼。 1、退出mysql [root@localhost src]# service mysqld stop 停止mysqld: [確定] [root ...
  • 1. 啟動過程中的記憶體初始化 首先我們來看看start_kernel是如何初始化系統的, start_kerne定義在 "init/main.c?v=4.7, line 479" 其代碼很複雜, 我們只截取出其中與記憶體管理初始化相關的部分, 如下所示 table th:nth of type(1){ ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...