diff命令输出格式解读

「爱情、让人受尽委屈。」 2022-07-30 13:11 1025阅读 0赞

diff命令输出格式解读

1. diff命令的用法

diff命令可以比较两个文件(或者文件夹)的差异。
命令的用法是:

  1. diff [选项] 改动前的文件(夹) 改动后的文件(夹)

如果是文件夹的比较,需要加【-r】选项。
关于其他很多选项,可以自行查资料,这里略。

2. diff的三种输出格式

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

  • 普通格式(normal diff)
  • 上下文格式(context diff),需要加-c选项
  • 合并格式(unified diff),需要加-u选项

为了便于讲解,我们先建立两个文本文件。文件名分别是f1(改动前)和f2(改动后)。
f1的内容是:

  1. a
  2. a
  3. a
  4. a

f2的内容是:

  1. a
  2. a
  3. b
  4. c
  5. d

2.1 普通格式

命令行输入

  1. $ diff f1 f2

得到的结果是

  1. 3,4c3,5
  2. < a
  3. < a ---
  4. > b
  5. > c
  6. > c

上面的输出分为4个部分。

2.1.1 3,4c3,5用来说明变动位置。

它又分成三个部分:

  1. 前面的3,4,表示f1的第3~4行;
  2. 中间的c表示变动的模式是内容改变(change),其他的模式还有a(增加,addition)和d(删除,deletion);
  3. 后面的3,5,表示f2的第3~5行。

2.1.2 f1中要删除哪些行

  1. < a
  2. < a

前面的小于号,表示要从f1中去除该行,后面的“a”表示该行的内容。

2.1.3 分割线

  1. ---

用于分割f1和f2的变动情况。

2.1.4 f2中要增加哪些行

  1. > b
  2. > c
  3. > c

前面的大于号表示f2增加了该行,后面的”b”或者”c”表示该行的内容。

2.2 上下文格式

使用方法是加入-c选项(代表context)。

  1. diff -c f1 f2

输出结果如下

  1. *** f1 2016-04-17 11:48:13.008810500 +0800
  2. --- f2 2016-04-17 11:48:24.090444400 +0800
  3. ***************
  4. *** 1,4 ****
  5. a
  6. a
  7. ! a
  8. ! a
  9. --- 1,5 ----
  10. a
  11. a
  12. ! b
  13. ! c
  14. ! c

上面的输出结果分为4个部分。

2.2.1 文件名和时间信息

  1. *** f1 2016-04-17 11:48:13.008810500 +0800
  2. --- f2 2016-04-17 11:48:24.090444400 +0800

特别注意:
***表示变动前的文件,---表示变动后的文件。

2.2.2 分割线

  1. ***************

2.2.3 变动之前的文件f1

  1. *** 1,4 ****
  2. a
  3. a
  4. ! a
  5. ! a

*** 1,4 ****表示变动前的文件(即f1)的第1~4行。
另外,文件内容的每一行最前面,都有一个标记位。如果为空,表示该行无变化;如果是(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。

2.2.4 变动后的文件f2

  1. --- 1,5 ----
  2. a
  3. a
  4. ! b
  5. ! c
  6. ! c

--- 1,5 ----表示变动后的文件(即f2)的第1~5行。其他如上文所述。

2.3 合并格式

如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了“合并格式”的diff,将f1和f2的上下文合并在一起显示。
它的使用方法是加入-u选项(代表unified)。

输入命令

  1. $ diff -u f1 f2

输出结果是

  1. --- f1 2016-04-17 11:48:13.008810500 +0800
  2. +++ f2 2016-04-17 11:48:24.090444400 +0800
  3. @@ -1,4 +1,5 @@
  4. a
  5. a
  6. -a
  7. -a
  8. +b
  9. +c
  10. +c

上面的结果分为3个部分。

2.3.1 文件名和时间信息

  1. --- f1 2016-04-17 11:48:13.008810500 +0800
  2. +++ f2 2016-04-17 11:48:24.090444400 +0800

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

2.3.2 变动位置

@@ -1,4 +1,5 @@
变动的位置放在两组@@之间。
-1,4表示对于变动前的文件,从第1行开始(包括第1行)连续4行(即1,2,3,4行)。
+1,5表示对于变动后的文件,从第1行开始(包括第1行)连续5行(即1,2,3,4,5行)。

2.3.3 变动的具体内容

  1. a
  2. a
  3. -a
  4. -a
  5. +b
  6. +c
  7. +c

它将两个文件的上下文,合并在一起显示,所以叫做”合并格式”。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行或者说在第一个文件的基础上增加的行。

其实变动一个文件,就好比改装汽车,可以看成是拆掉一分部零件(-)再装上一部分零件(+)的过程。
下图说明了行号和文件的对应关系。
DiRJSXD.png

【end】

参考资料


阮一峰:读懂diff

发表评论

表情:
评论列表 (有 0 条评论,1025人围观)

还没有评论,来说两句吧...

相关阅读

    相关 linux diff 命令

    场景:告诉对方我修改了什么,或者让对方直接打个补丁就能将你修改的直接合并上去。 -------------------- 测试:编写两个 txt 文件,将 txt2 修改第

    相关 Linux diff命令

    Linux diff命令用于比较文件的差异。 diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

    相关 diff命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二

    相关 Linux命令diff

    diff 1.作用 diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。 2.格式 diff [options] 源文件 目标文

    相关 git diff 命令

    git diff 命令可以对比两个版本的差异,具体来说包括: 1. 本地工作区和暂存区的diff信息:git diff 或者 git diff file 2. 暂存区和版

    相关 Linux diff命令

    Linux diff命令用于比较文件的差异。 diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。