diff是Unix系统的一个很重要的工具程序。

它用来比较两个文本文件的差异,是代码版本管理的基石之一。你在命令行下,输入:

$ diff <变动前的文件> <变动后的文件>

diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件。也使用patch命令对相应的文件打补丁。它的显示结果不太好懂,下面我就来说明,如何读懂diff。

FILES的格式:

FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。
DIR1 DIR2 :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。
FILE DIR :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。
DIR FILE :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。
FILE可以是“-”,代表由标准输入设备读入的文本。DIR不能是"-"。
被指定的文件不能是标准的输入。
短选项 长选项 含义
-i --ignore-case 忽略文件内容大小写的区别
  --ignore-file-name-case 忽略文件名大小写的区别
  --no-ignore-file-name-case 不忽略文件名大小写的区别
-E --ignore-tab-expansion 忽略由制表符宽度造成的差异
-b --ignore-space-change 忽略由空格数不同造成的差异
-w --ignore-all-space 忽略所有空格
-B --ignore-blank-lines 忽略任何因空行而造成的差异
-I --ignore-matching-lines=RE 如果某行匹配正则表达式,则忽略由该行造成的差异
-a --text 所有文件都以文本方式处理
  --strip-trailing-cr 去除输入内容每行末端的 carriage return 字符
-c 或 或 -C 行数 --context[=行数] 显示指定<行数>(默认 3 行)copied 格式的上下文
-u  或 -U 行数 --unified[=行数] 显示指定<行数>(默认 3 行)unified 格式的上下文(合并的方式)
  --label 标识 使用<标识>代替文件名称
-p --show-c-function 显示和每个差异有关的 C 函数名称
-F  --show-function-line=RE 显示最接近而符合<正则表示式>的一行
-q --brief 只显示文件是否不同
-e --ed 以 ed script 方式输出
  --normal 以正常的 diff 方式输出
-n --rcs 以 RCS diff 格式输出
-y --side-by-side 以两列并排的方式显示
-W --width=NUM 每行显示最多 NUM (默认 130) 个字符
  --left-column 当有两行相同时只显示左边的一行
  --suppress-common-lines 当有两行相同时不会显示
-D --ifdef=NAME 输出的内容以‘#ifdef NAME’方式标明差异
  --GTYPE-group-format=GFMT 效果类似,但会以 GFMT 格式处理 GTYPE 输入的行
可以是LTYPE的选择或是‘changed’
  --line-format=LFMT 效果类似,但会以 LFMT 格式处理每一行资料
  --LTYPE-line-format=LFMT 效果类似,但会以 LFMT 格式处理 LTYPE 输入的行
LTYPE 可以是‘old’、‘new’或‘unchanged’。
-l --paginate 将输出送至‘pr’指令来分页
-t --expand-tabs 将输出中的 tab 转换成空格
-T --initial-tab 每行先加上 tab 字符,使 tab 字符可以对齐
  --tabsize=NUM 定位字符 (tab) 的宽度,默认为 8 个空格宽
  --suppress-blank-empty suppress space or tab before empty output lines
-r --recursive 递归比较子目录中的文件
-N --new-file 不存在的文件以空文件方式处理
  --unidirectional-new-file 若第一文件案不存在,以空文件处理
-s --report-identical-files 文件相同则报告,否则无任何提示
-x --exclude=PAT 排除匹配 PAT 的文件
-X --exclude-from=FILE 排除所有匹配在 FILE 中列出的模式的文件
-S --starting-file=FILE 当比较目录時,由 FILE 开始比较
  --from-file=FILE1 将 FILE1 和操作数中的所有文件/目录作比较。FILE1 可以是目录
  --to-file=FILE2 将操作数中的所有文件/目录和 FILE2 作比较。FILE2 可以是目录
  --horizon-lines=NUM keep NUM lines of the common prefix and suffix
-d --minimal 尽可能找出最小的差异
  --speed-large-files 假设文件十分大而且其中含有许多微小的差异

一、diff的三种格式

由于历史原因,diff有三种格式:

* 正常格式(normal diff)
* 上下文格式(context diff)
* 合并格式(unified diff)

我们依次来看。

二、示例文件

为了便于讲解,先新建两个示例文件。

log2014.log内容
2013-01
2013-02
2014-03
2013-04
2013-05
2013-06
2013-07
2013-07
2013-09
2013-10
2013-11
2013-12 log2013.log内容
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10   

三、正常格式的diff

diff输出格式(默认):
n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
n1,n2 d n3 表示删除n1到n2行,合并到目标文件的n3行
n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替换掉
字母a:表示附加(add)
字符c:表示修改(change)
字符d:表示删除(delete)
字母前的是源文件,字母后是目标文件。Nx表示行号。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。

比较两个文件

[root@localhost test3]# diff log2014.log log2013.log
3c3
< 2014-03
---
> 2013-03
8c8
< 2013-07
---
> 2013-08
11,12d10
< 2013-11
< 2013-12

上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。

以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。

并排格式输出

[root@localhost test3]# diff log2014.log log2013.log  -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11 <
2013-12 < [root@localhost test3]# diff log2013.log log2014.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10
> 2013-11
> 2013-12

说明:

“|”表示前后2个文件内容有不同

“<”表示后面文件比前面文件少了1行内容

“>”表示后面文件比前面文件多了1行内容  

四、上下文格式的diff

上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。

它的使用方法是加入c参数(代表context)。

[root@localhost test3]# diff log2013.log log2014.log  -c 

显示结果如下:

*** log2013.log 2012-12-07 16:36:26.000000000 +0800
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
***************
*** 1,10 ****
2013-01
2013-02
! 2013-03
2013-04
2013-05
2013-06
2013-07
! 2013-08
2013-09
2013-10
--- 1,12 ----
2013-01
2013-02
! 2014-03
2013-04
2013-05
2013-06
2013-07
! 2013-07
2013-09
2013-10
+ 2013-11
+ 2013-12

这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:

“+” 比较的文件的后者比前着多一行

“-” 比较的文件的后者比前着少一行

“!” 比较的文件两者有差别的行

[root@localhost test3]# diff log2014.log log2013.log  -c
*** log2014.log 2012-12-07 18:01:54.000000000 +0800
--- log2013.log 2012-12-07 16:36:26.000000000 +0800
***************
*** 1,12 ****
2013-01
2013-02
! 2014-03
2013-04
2013-05
2013-06
2013-07
! 2013-07
2013-09
2013-10
- 2013-11
- 2013-12
--- 1,10 ----
2013-01
2013-02
! 2013-03
2013-04
2013-05
2013-06
2013-07
! 2013-08
2013-09
2013-10   

五、合并格式的diff

如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将比较文件的上下文合并在一起显示。

它的使用方法是加入u参数(代表unified)。

[root@localhost test3]# diff log2014.log log2013.log  -u
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
@@ -1,12 +1,10 @@
2013-01
2013-02
-2014-03
+2013-03
2013-04
2013-05
2013-06
2013-07
-2013-07
+2013-08
2013-09
2013-10
-2013-11
-2013-12

第一部分,也是文件的基本信息:

--- log2014.log 2012-12-07 18:01:54.000000000 +0800

+++ log2013.log 2012-12-07 16:36:26.000000000 +0800

"---"表示变动前的文件,"+++"表示变动后的文件。

第二部分,变动的位置用两个@作为起首和结束

@@ -1,12 +1,10 @@

前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。意思:第一个文件从第1行开始的连续12行。

同样的,"+1,10" 表示第二个文件从第1行开始的连续10行。

参考链接

http://www.lampweb.org/linux/3/17.html

http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

  

  

  

  

  

  

  

  

  

linux常用命令--diff的更多相关文章

  1. Linux常用命令(一)

    Linux常用命令 1. pwd查看当前路径(Print Working Directory)    [root@CentOS ~]# pwd/root 2. cd .. 返回上一级 .. 表示上一级 ...

  2. linux——常用命令与脚本

    linux常用命令 --文件管理pwd --查看当前目录cd --切换当前目录ls --列出当前目录下的所有文件touch --创建文件mkdir --建立目录rmdir --删除空目录rm --删除 ...

  3. DOS 和 Linux 常用命令的对比

    DOS 和 Linux 常用命令的对比 许多在 shell 提示下键入的 Linux命令都与你在 DOS 下键入的命令相似.事实上,某些命令完全相同. 本附录提供了 Windows的 DOS 提示下的 ...

  4. Linux常用命令速查备忘

    Linux常用命令速查备忘   PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...

  5. Linux常用命令英文全称与中文解释Linux系统

    Linux常用命令英文全称与中文解释Linux系统(转)   Linux常用命令英文全称与中文解释Linux系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Pri ...

  6. Linux 常用命令使用方法大搜刮

    Linux 常用命令使用方法大搜刮 1.# 表示权限用户(如:root),$ 表示普通用户  开机提示:Login:输入用户名  password:输入口令   用户是系统注册用户成功登陆后,可以进入 ...

  7. Linux 常用命令 (common commands for linux)

    Linux 常用命令 (Common Commands For Linux) 1.声明,此文章仅写基于 Bash shell 常用的命令,如果遇上命令在使用过程中提示没有,可能随着更新,命令也被替换掉 ...

  8. Linux常用命令手册

    Linux常用命令手册 NO 分类 PS1 命令名 用法及参数 功能注解 对应章节 1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件     文件管理 # ls ls ...

  9. Linux常用命令全称

    Linux常用命令全称 pwd:print work directory   打印当前目录 显示出当前工作目录的绝对路径 ps: process status(进程状态,任务管理器)    常用参数: ...

随机推荐

  1. C# 十进制和十六进制转换

    转至:http://www.cnblogs.com/fwind/archive/2012/04/13/2445380.html 在C#中,十进制和十六进制转换非常简单,方法如下: 十进制转为十六进制: ...

  2. jdk内存

  3. 常见maven镜像

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...

  4. 跨平台渲染框架尝试 - GPU Buffer的管理(1)

    buffer资源 下面来谈谈buffer的管理.buffer资源从广义上就是C语言的数组.如下图所示. 图 buffer的广义模型 在渲染管线中,无论是opengl还是dx或者其他的渲染api,都会提 ...

  5. BestCoder Round #20 部分题解(A,B,C)(hdu5123,5124,5125)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud who is the best? Time Limit: 2000/1000 MS ...

  6. CDZSC_2015寒假新人(1)——基础 i

    Description “Point, point, life of student!” This is a ballad(歌谣)well known in colleges, and you mus ...

  7. 字符串分割与数组的分割 split()VSsplice()&slice()

    一.作用对象 1.split()方法是对字符串的操作:splice()和slice()是对数组的操作.slice()也可用于字符串. 二.参数 1.split(separator,howmany) 参 ...

  8. css布局学习笔记之box-sizing

    当你设置了元素的宽度,实际展现的元素却能够超出你的设置:因为元素的边框和内边距会撑开元素. .div{ width: 500px; margin: 20px auto; padding: 50px; ...

  9. iptables中规则的关系——以只允许某些IP段访问为例

    最近遇到一个问题:服务器被全球的IP频繁试图通过ssh登录. 于是想到通过iptables防火墙限制访问,达到:仅允许指定ip段访问ssh服务(22端口). 关于iptables添加规则的文章有很多, ...

  10. 在virtualenv中安装libxml2和libxslt

    在使用python的工作中,需要使用到libxml2和libxslt库.原来在实际环境中已经安装完成了,但是在virtualenv中还没有,现在正在整理virtualenv的环境.下面把在virtua ...