1.概述

本文将要讨论的是diff命令,diff用来比较两个文件。当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在windows下工作,这些GUI的比较工具绝对是首选。对于在linux环境下工作的人来说,如果每次想看两个文件的区别都要将文件下载到windows环境然后用图形工具进行比较实在是太麻烦了。那么我们必须学会使用linux环境下的比较工具diff。

2.diff如何工作,如何理解diff的执行结果

diff分析两个文件,并输出两个文件的不同的行。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配。diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。
现在让我们来看一下diff是如何工作的,假设有两个文件:

//file1.txt
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.

//file2.txt
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.

我们使用diff比较他们的不同:
diff file1.txt file2.txt

输出如下结果:
2,4c2,4
< I need to run the laundry.
< I need to wash the dog.
< I need to get the car detailed.
---
> I need to do the laundry.
> I need to wash the car.
> I need to get the dog detailed.

我们来说明一下该输出结果的含义,要明白diff比较结果的含义,我们必须牢记一点,diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。我们看看上面的比较结果中的第一行 2,4c2,4 前面的数字2,4表示第一个文件中的行,中间有一个字母c表示需要在第一个文件上做的操作(a=add,c=change,d=delete),后面的数字2,4表示第二个文件中的行。

2,4c2,4 的含义是:第一个文件中的第[2,4]行(注意这是一个闭合区间,包括第2行和第4行)需要做出修改才能与第二个文件中的[2,4]行相匹配。
接下来的内容则告诉我们需要修改的地方,前面带 < 的部分表示左边文件的第[2,4]行的内容,而带> 的部分表示右边文件的第[2,4]行的内容,中间的 --- 则是两个文件内容的分隔符号。

3.Normal模式

上面的部分我们说明了如何查看diff命令的结果,实际上对于上面的比较,我们使用的是diff命令的Normal模式,这也是diff命令的默认模式,也就是说diff两个文件的时候如果不加模式参数则是默认模式进行比较,其效果与(--normal)一样,我们举一些例子来说明Normal模式下的输出结果(前面已经说明了一种比较结果),为了直观查看两个文件的不同我在windows下面通过BeyondCompare工具列出两个文件的不同,而截图下面的黑色部分则是diff的比较输出截图。

第一个文件比第二个文件少了行的情况:

第一个文件比第二个文件多出行的情况:

第一个文件与第二个文件不相同的情况:

以上diff命令执行的时候没有指定额外的模式参数,所以其使用的是默认的Normal模式,效果与添加命令行参数--normal 是一样的。

4.Context模式

默认情况下的模式输出结果实际上是符合计算机的思维方式,不太直观,所以其输出结果并不能够很好的被人理解,diff命令除了默认模式之外还提供了另外两种模式,Context和Unified模式,本节我们说说如何查阅Context模式下的输出结果。diff命令应用Context模式只需要添加命令行参数 diff -c  即可,我们先看看两个案例文件:

接下来说明这两个文件以diff  -c 方式比较的结果:

5.Unified模式

diff还有一种比较方式,也即Unified模式,使用命令行 –u 来执行该模式的比较。其比较结果与Context模式很像,但是简化了一些输出,我们看看我们的案例文件,与上面的一样:

使用diff –u 比较的结果:

可以看到其比较结果与Context模式实际上差不多,只不过将比较结果合并到一起了。

6.比较目录

使用diff可以比较两个目录,其比较格式是  diff  directory1  directory2 查看如下目录比较结果:

比较两个目录的时候无非是有的文件仅仅存在于某个目录中而在另一个目录中没有,如果存在同名的文件,则比较这两个文件的不同。diff比较目录的结果我们可以结合grep命令筛选出我们想要的输出,例如仅仅输出两个目录下不同的文件而忽略掉某一个目录独有另一个目录不存在的输出记录。

另外比较目录的时候有两个参数很有用,-r 和 -q  ,前者表示递归比较目录中的子目录,后者表示仅仅列出两个目录中有哪些文件不同,而不去比较目录中各个文件的具体内容。特别是在作版本控制的时候,比较的两个目录如果文件很多,我们可能只需要知道两个目录有那些文件有差异就行了,而不需要diff列出具体的差异内容,因为文件很多,默认情况下diff会输出两个目录所有不同文件的内容差异,这会使得输出很多很杂乱,加上-q之后则只会输出不同的文件名。

diff -r -q directory1 direcotory2

7.一些有用的参数

diff还提供了一些有用的参数来控制比较行为与输出结果,一些常用的参数如下:
-b  --ignore-space-change 忽略空格,如果两行进行比较,多个连续的空格会被当作一个空格处理,同时会忽略掉行尾的空格差异。
-w --ignore-all-space 忽略所有空格,忽略范围比-b更大,包括很多不可见的字符都会忽略。
-B 忽略空白行。
-y  输出两列,一个文件一列,有点类似GUI的输出外观了,这种方式输出更加直观。
-W 大写W,当指定-y的时候设置列的宽度,默认是130
-x, --exclude=PAT 比较目录的时候排除指定PAT模式的文件名的比较
-i, --ignore-case 忽略两个文件中大小写的不同
-e 将比较的结果保存成一个ed脚本,之后ed程序可以执行该脚本文件,从而将file1修改成与file2的内容相同,这一般在patch的时候有用。
-r 如果比较两个目录,-r参数会比较其下同名的子目录
-q 输出结果中,只指出两个文件不同,而不输出两个文件具体内容的比较,这在比较两个目录的时候很好用。我们只需要知道两个目录下那些文件做了修改,而不需要知道每个文件具体修改了那些内容。特别是当两个目录文件很多的时候。

diff  -e  1.txt  2.txt  > script.txt
这样就是生成了一个ed可以执行的脚本文件script.txt,生成脚本文件之后我们还需要做一个操作, 在脚本文件末尾添加ed的write指令,只需要执行 echo "w" >>script.txt 将w指令附加到脚本文件的最后一行即可。
那么如何应用该脚本文件呢,可以这样使用:
ed  -  1.txt < script.txt 
注意中间的 – 符号表示从标准输入中读取,而 < script.txt 则重定向script.txt的内容到标准输入。这样执行之后1.txt的内容将与2.txt完全相同。

diff详解,读懂diff结果-转载的更多相关文章

  1. diff详解,读懂diff结果

    1.概述 本文将要讨论的是diff命令,diff用来比较两个文件.当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形 ...

  2. 读懂diff(转载)

    作者: 阮一峰 日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前 ...

  3. 读懂diff【转】

    本文转载自:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html 读懂diff   作者: 阮一峰 日期: 2012年8月29日 d ...

  4. 读懂diff

    作者: 阮一峰 日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前 ...

  5. linux diff详解

    diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> ...

  6. diff详解

    作者: 阮一峰 日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前 ...

  7. (转)读懂diff

    http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异, ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  9. 服务器.htaccess 详解以及 .htaccess 参数说明(转载)

    htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到限 ...

随机推荐

  1. awesome go library 库,推荐使用的golang库

    https://github.com/avelino/awesome-go https://github.com/spf13/cobra                        # A Comm ...

  2. WebService之Axis2(1):用POJO实现0配置的WebService

    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持S ...

  3. [LeetCode] 200. Number of Islands_ Medium tag: BFS

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  4. 模仿WIN32程序处理消息

    #include "stdafx.h" #include "MyMessage.h" #include <conio.h> using namesp ...

  5. python isinstance()与type()的区别

    例如在继承上的区别: isinstance() 会认为子类是一种父类类型,考虑继承关系. type() 不会认为子类是一种父类类型,不考虑继承关系. class A: pass class B(A): ...

  6. mysql设置环境变量

    临时修改环境变量 我们可以使用set语法在运行时修改环境变量,修改global变量后,对修改之前的session没有影响,对修修改之后的session生效:修改session变量后,修改后,对于该se ...

  7. linux常用命令:du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项] [文件|目录] 2. ...

  8. 20165207 Exp4 恶意代码分析

    目录 1.实验内容 1.1.系统运行监控 1.1.1.使用命令行创建计划任务 1.1.2.使用命令行借助批处理文件创建计划任务 1.1.3.分析netstat计划任务的最终结果 1.1.4.安装配置s ...

  9. bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统

    题目链接:1,2 treap恶心题,不多说 #include<algorithm> #include<iostream> #include<cstdlib> #in ...

  10. MySQL Crash Course #12# Chapter 18. Full-Text Searching

    INDEX 由于性能.智能结果等多方面原因,在搜索文本时,全文搜索一般要优于通配符和正则表达式,前者为指定列建立索引,以便快速找到对应行,并且将结果集智能排序.启用查询扩展可以让我们得到未必包含关键字 ...