Linux命令學習手冊-diff

diff [選項] file1 file2

功能

該命令的功能為逐行比較兩個文本文件,列出其不同之處。它比 comm 命令完成更復雜的檢查。它對給出的文件進行系統的檢查,并顯示出兩個文件中所有不同的行,不要求事先對文件進行排序。

舉例

假設有這樣兩個文件:

  1. 程序清單1 :hello.c

    #include <stdio.h>
    int main(void)
    {
        char msg[] = "Hello world!";
        puts(msg);
        printf("Welcome to use diff commond.\n");
        return 0;    
    }
    
  2. 程序清單2:hello_diff.c

    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
        char msg[] = "Hello world,fome hello_diff.c";
        puts(msg);
        printf("hello_diff.c says,'Here you are,using diff.'\n");
        return 0;    
    }
    

可有如下命令:

  • 查看這兩個文件的不同之處,普通格式輸出:

    $diff hello.c hello_diff.c 
    1a2
    > #include <stdlib.h>
    5c6
    <       char msg[] = "Hello world!";
    ---
    >       char msg[] = "Hello world,fome hello_diff.c";
    8c9
    <       printf("Welcome to use diff commond.\n");
    ---
    >       printf("hello_diff.c says,'Here you are,using diff.'\n");
    

    這里, 1a2 表示后面的一個文件 hello_diff.c 比前面的一個文件 hello.c 多了一行 5c6 表示第一個文件的第5行與第二個文件的第6行有區別。

  • 查看這兩個文件的不同之處,并排輸出格式:

    $diff hello.c hello_diff.c -y -W 130
    #include <stdio.h>                                                  #include <stdio.h>
                                                                      > #include <stdlib.h>
    int main(void)                                                      int main(void)
    {                                                                   {
          char msg[] = "Hello world!";                              |         char msg[] = "Hello world,fome hello_diff.c";
          puts(msg);                                                          puts(msg);
          printf("Welcome to use diff commond.\n");                 |         printf("hello_diff.c says,'Here you are,using diff.'\n");
          return 0;                                                           return 0;
    }                                                                   }
    

    這里,并排格式的對比一目了然,可以快速找到不同的地方。 -W 選擇可以指定輸出列的寬度,這里指定輸出列寬為130。

  • 查看這兩個文件的不同之處,上下文格式輸出:

    $diff hello.c hello_diff.c -c
    *** hello.c     2007-09-25 17:54:51.000000000 +0800
    --- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    ***************
    *** 1,11 ****
    #include <stdio.h>
    int main(void)
    {
    !       char msg[] = "Hello world!";
            puts(msg);
    !       printf("Welcome to use diff commond.\n");
            return 0;
    }
    --- 1,12 ----
      #include <stdio.h>
    + #include <stdlib.h>
    
    int main(void)
    {
    !       char msg[] = "Hello world,fome hello_diff.c";
            puts(msg);
    !       printf("hello_diff.c says,'Here you are,using diff.'\n");
            return 0;
    }
    

    這里,在開頭兩行作了比較文件的說明,這里有三中特殊字符:
    + 比較的文件的后者比前著多一行
    - 比較的文件的后者比前著少一行
    ! 比較的文件兩者有差別的行

  • 查看這兩個文件的不同之處,統一輸出格式:

    $diff hello.c hello_diff.c -u
    --- hello.c     2007-09-25 17:54:51.000000000 +0800
    +++ hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    @@ -1,11 +1,12 @@
     #include <stdio.h>
    +#include <stdlib.h>
    int main(void)
    {
    -       char msg[] = "Hello world!";
    +       char msg[] = "Hello world,fome hello_diff.c";
            puts(msg);
    -       printf("Welcome to use diff commond.\n");
    +       printf("hello_diff.c says,'Here you are,using diff.'\n");
            return 0;
    }
    

    這里,統一格式的輸出更加緊湊,所以更易于理解,更易于修改。

  • 查看兩個文件是否不同又不想顯示差異之處

    $diff hello.c hello_diff.c -q
    Files hello.c and hello_diff.c differ
    

    這里,如果兩個文件相同,那么不會輸出任何信息。

  • 查看這兩個文件的不同之處,忽略帶有“ include”字樣的行:

    $diff hello.c hello_diff.c -c -I include
    *** hello.c     2007-09-25 17:54:51.000000000 +0800
    --- hello_diff.c        2007-09-25 17:56:00.000000000 +0800
    ***************
    *** 2,11 ****
    int main(void)
    {
    !       char msg[] = "Hello world!";
            puts(msg);
    !       printf("Welcome to use diff commond.\n");
            return 0;
    }
    --- 3,12 ----
    int main(void)
    {
    !       char msg[] = "Hello world,fome hello_diff.c";
            puts(msg);
    !       printf("hello_diff.c says,'Here you are,using diff.'\n");
            return 0;
    }
    

    這里,另外你還可以提供一些匹配規則來忽略某中差別,可以用 -I regexp(正則表達式).

描述

說明:該命令告訴用戶,為了使兩個文件 file1file2 一致,需要修改它們的哪些行。如果用 - 表示 file1fiie2 ,則表示標準輸入。如果 file1file2 是目錄,那么 diff 將使用該目錄中的同名文件進行比較。

  • 參數
    -b 忽略行尾的空格,而字符串中的一個或多個空格符都視為相等。
    -c 采用上下文輸出格式(提供三行上下文)。
    -C n 采用上下文輸出格式(提供n行上下文)。
    -e 產生一個合法的ed腳本作為輸出。
    -r 當file1和file2是目錄時,遞歸作用到各文件和目錄上。

  • 結果
    例如: diff /usr/xu mine 把目錄 /usr/xu 中名為 mine 的文件與當前目錄中的 mine 文件進行比較。

    通常輸出由下述形式的行組成:

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

    這些行類似 ed 命令把 filel 轉換成 file2 。字母( adc )之前的行號( n1n2 )是針對 file1 的,其后面的行號( n3n4 )是針對 file2 的。字母 ad 和=c= 分別表示附加、刪除和修改操作。

    在上述形式的每一行的后面跟隨受到影響的若干行,以 < 打頭的行屬于第一個文件,以 > 打頭的行屬于第二個文件。

    另外,=diff= 能區別塊和字符設備文件以及FIFO(管道文件),不會把它們與普通文件進行比較。

其它

diffpatch 的使用:

diff/patch 這對工具在數學上來說, diff 是對2個集合求差, patch 是求和

  • 生成 AB 的diff文件 C:

    $diff A B > C
    

    這里 C 相當于 AB 的一個“補丁”文件,記錄兩者之間的差異。

  • A 打上diff文件得到 B:

    $patch A C
    

    這里,如果用 patch B C 則會提示警告告訴你用反了。

  • B 還原為 A:

    $patch -R B C
    

    這里,如果用 patch -R A C 則會提示警告告訴你用反了。

內核補丁

  • 生成

    $diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch
    
  • 升級

    $cp diff.patch linux-2.6.xxx/.
    $cd linux-2.6.xxx
    $patch -p1 < diff.patch
    

參考資料

http://baike.baidu.com/view/1374858.htm

http://blog.csdn.net/zhanglei6645/archive/2007/10/16/1827728.aspx

http://www.linuxdiyf.com/viewarticle.php?id=42597

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,407評論 0 2
  • 第1章 第一個C程序第2章 C語言基礎第3章 變量和數據類型第4章 順序結構程序設計第5章 條件結構程序設計第6章...
    小獅子365閱讀 10,723評論 3 71
  • 信號信號是linux操作系統進程間通信的一種方式,一個應用進程可以接受、發送信號給另一個進程,當進程捕獲到某個信號...
    zhile_doing閱讀 496評論 0 0
  • 題目來源:1、中興、華為、慧通、英華達、微軟亞洲技術中心等中外企業面試題目;2、C 語言面試寶典(林銳《高質量編程...
    月震閱讀 1,843評論 0 1
  • 每個人心中都住著兩個自我,一個理性,一個沖動,一個 乖巧懂事,一個狹窄自私。 于是內心常常充滿矛盾和斗爭。 是的,...
    荷葉的荷閱讀 69評論 0 0