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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,320评论 0 2
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,585评论 3 71
  • 信号信号是linux操作系统进程间通信的一种方式,一个应用进程可以接受、发送信号给另一个进程,当进程捕获到某个信号...
    zhile_doing阅读 457评论 0 0
  • 题目来源:1、中兴、华为、慧通、英华达、微软亚洲技术中心等中外企业面试题目;2、C 语言面试宝典(林锐《高质量编程...
    月震阅读 1,789评论 0 1
  • 每个人心中都住着两个自我,一个理性,一个冲动,一个 乖巧懂事,一个狭窄自私。 于是内心常常充满矛盾和斗争。 是的,...
    荷叶的荷阅读 63评论 0 0