美文网首页LinuxLinux学习之路
Linux命令学习手册-diff

Linux命令学习手册-diff

作者: QuietHeart | 来源:发表于2019-12-17 08:56 被阅读0次

    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

    相关文章

      网友评论

        本文标题:Linux命令学习手册-diff

        本文链接:https://www.haomeiwen.com/subject/hdiogctx.html