diff详解,读懂diff结果

 

阅读目录

回到顶部

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命令筛选出我们想要的输出,例如仅仅输出两个目录下不同的文件而忽略掉某一个目录独有另一个目录不存在的输出记录。

回到顶部

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的时候有用。

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完全相同。

 

http://www.cnblogs.com/wangqiguo/p/5793448.html

 

时间: 2024-11-08 19:12:09

diff详解,读懂diff结果的相关文章

读懂diff

diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> diff就会告诉你,这两个文件有何差异.它的显示结果不太好懂,下面我就来说明,如何读懂diff. 一.diff的三种格式 由于历史原因,diff有三种格式: * 正常格式(normal diff) * 上下文格式(context diff) * 合并格式(unified diff) 我们依次来看. 二.示例文

《OSPF和IS-IS详解》一6.1 OSPF数据库同步

6.1 OSPF数据库同步 OSPF和IS-IS详解 读至本章,读者想必知道,OSPF协议是一种结构性很强的路由协议.既然读者都清楚OSPF数据库同步的可靠性和精确性是如此重要,那么也就不会对用来管理OSPF数据库同步过程的状态机(名为邻居状态机)的复杂程度感到惊讶了.简而言之,在数据库同步过程中,邻居状态机会驱动(OSPF路由器)采取以下"行动". 1.当相邻的两台路由器决定彼此建立邻接关系时,会进行分工:一台起"主导"作用,另外一台会进行"配合&quo

《OSPF和IS-IS详解》一第6章 链路状态数据库同步6.1 OSPF数据库同步

第6章 链路状态数据库同步 OSPF和IS-IS详解 有一句话作者此前曾反复提及,现在再说一遍:链路状态路由协议的"精髓"在于,隶属同一区域的每台路由器都会根据存储在一个公共拓扑数据库里的信息,执行本机路由计算.因此,在同一区域内,每台路由器所存储的拓扑数据库的内容必须完全一样.路由器之间相互同步链路状态数据库的目的正是为此.在OSPF或IS-IS网络中,路由器只要上线运行,就必须与邻居路由器进行数据库同步,以确保各自所持数据库的内容完全相同.若路由器刚接入点到点链路,便会与链路对端的

linux中diff命令的使用详解

diff命令是版本管理工具的基础,本文主要讲解diff比较几种方式和git diff使用技巧.如下两个文件,file1和file2 $ cat file1aaaaaaaaaa$ cat file2aaaabbaaaa 1.普通格式diff file1 file2$ diff file1 file23c3< aa---> bb 说明:3c3表示file1的第3行有变化(change),变动为file2的第3行;<表示从file1当中去除该行;---分割file1和file2;>表示f

awk正则表达式和内置函数的使用方法实例详解_linux shell

awk正则表达式及内置函数实例详解: 1.模糊匹配: 复制代码 代码如下: awk '{if($3~/97/) print $0}' data.f:如果第三项中含有"97"则打印该行 awk '{if($4!~/ufcx/) print $0}' data.f:如果第三项中不含ufcx有则打印 2.精确匹配: 复制代码 代码如下: awk '{if($5==66) print $0}' data.f:如果第五项是66则打印 awk '{if($5!=66)print $0}' data

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃.便没有对于Java..net.PHP 之间谁强谁弱的争执了. 希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OO的编程过程. 相对PHP4,PHP5在面向对象方面改变了很多.我们将只介绍PHP5环境下的面向对象.而我们必须改变自己来跟随PHP5的发展.如果代

详解CSS布局设计块元素和内联元素

css|设计|详解 块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P."form"这个块元素比较特殊,它只能用来容纳其他块元素. 如果没有css的作用,块元素会顺序以每次另起一行的方式一直往下排.而有了css以后,我们可以改变这种html的默认布局模式,把块元素摆放到你想要的位置上去.而不是每次都愚蠢的另起一行.需要指出的是,table标签也是块元素的一种,table based layout

PS CS中的“照片滤镜/Photo Filter”命令详解

滤镜|详解 出处:5D多媒体 这是一个跟摄影有关的重要图像调整命令. 有关这一命令的教程,现在网上没一个能说得清楚.讲得明白的.一定是我还没有找到缘故吧,反正我找到的都不你给解释,都举一个小例子了事. 要想搞明白,我首先想到了PS CS自带的帮助文档.我用是英文汉化版的PS,帮助文档没有翻译过来,看着英文自己不敢那么地确定.向群里的QQ好友要来了中文帮助说明.(在此感谢QQ好友:好像一条狗锐漫.冷弦.爱新觉罗小盆 : ) 有关这一命令的中文版叫"照片滤镜",英文版叫 "Pho

.NET配置文件解析过程详解

过程|详解 在我看来,WEB project的开发与WINFORM的开发最大的区别在于web的运行是在Framework上更高一层框架上运行,即ASP.NET框架,程序员在web下的开发可以说是黑盒开发,不是让你去定义程序入口和执行顺序,而是asp.net来调用你的各个方法,程序员做的一切都是一种受控的舞蹈.就像我们调用nunit之类的工具来测试一个dll一样,nunit是容器,是框架,执行哪个方法是由nunt来决定的.因此,也就有了页面执行周期各状态等令刚入门的程序员困惑不已的事,其实,究其根