在 Linux 终端中使用 Diff 命令比较两个文件

当您需要在 Linux 中比较两个包含相似文本的文件时,使用 差异命令 可以使您的任务更轻松。 该命令比较两个文件以建议使文件相同的更改。 非常适合找到破坏新更新代码的额外花括号。

使用 diff 命令非常简单。 这是语法:

diff [options] file1 file2

但是了解它的输出是另一回事。 不用担心,我会解释输出,以便您可以比较两个文件并了解它们之间的区别。

了解 Linux 中的 diff 命令

您需要几个文件才能开始。 我使用随机单词生成器生成了一个列表。

我将列表添加到两个不同的文件中,然后通过以下方式修改了列表:

  • 更改列表顺序
  • 添加字母
  • 开关盒

我将这些类似的文件保存为 1.txt 和 2.txt。 这是你做任何事情之前它们的样子。

我建议您在阅读时按照教程进行操作,因此请创建新文件并向其中添加以下内容。

1.txt的内容

蛛网
挂坠盒
声学
扩张
记录

2.txt的内容:

蛛网
挂坠盒
声学
记录
扩张

示例 1:没有选项的差异

让我们看看运行时会发生什么 diff 命令没有任何选项。

christopher:~$ diff 1.txt 2.txt
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

使困惑? 你不是一个人。 输出并不完全适合人类。 为了了解发生了什么,您需要更多地了解 diff 的工作原理。

了解分析完成后可能会有所帮助, 文件2 [in the syntax] 被视为您尝试匹配的参考文档。 所以,你可能会说 diff 是这样工作的:

diff <file_to_edit> <file_as_reference>

这也意味着您将根据放置文件名的顺序获得不同的输出。

顺序很重要

一个 example 输出如何因文件顺序而异:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

christopher:~$ diff 2.txt 1.txt 
2c2
< LOCKET
---
> locket
4d3
< records
5a5
> record

diff 命令输出中的重要符号

使用下表作为参考,您可以更好地了解终端中发生的情况。

象征意义
一种添加
C改变
D删除
#行号
– – –在输出中分隔文件
<文件 1
>文件 2

让我们再看一下 diff 命令输出:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

diff 命令输出说明

让我们看看输出的第一个区别:

输出线解释
2c2文件 1 的第 2 行,与文件 2 的第 2 行更改。
< 挂坠盒——> 挂坠盒将“locket”更改为“LOCKET”以匹配文件 2.txt

让我们看一下输出的下一部分:

输出线解释
3a4在文件 1 的第 3 行之后,添加文件 2 的第 4 行。
> 记录即添加“记录”以在文件 1 中创建第 4 行。这样文件 1.txt 将匹配文件 2.txt

相似地:

输出线解释
5d5 < 记录从文件 1 的第 5 行删除文本“记录”。这样文件 1.txt 将匹配文件 2.txt

该命令中没有内置拼写检查或字典功能。 它不承认“记录”和“记录”是相关的。 它的唯一目标是完美匹配这两个文件。

查看输出,翻译仍然非常困难。 您不太可能节省大量时间。

幸运的是,可以添加一些选项以使内容更易于阅读。 让我们看几个使用相同列表的不同示例。

示例 2:在“复制”上下文中使用 -c 区分

上下文选项在默认显示的更多编程信息上提供了更直观的表示。 让我们继续我们的 example 文本。

diff 命令输出中更重要的符号

象征意义
+添加
改变
删除
***文件 1
– – –文件 2
christopher:~$ diff -c 1.txt 2.txt 
*** 1.txt    2019-10-20 12:05:09.244673327 -0400
--- 2.txt    2019-10-20 12:11More:31.382547316 -0400
***************
*** 1,5 ****
  cobweb
! locket
  acoustics
  expansion
- record
--- 1,5 ----
  cobweb
! LOCKET
  acoustics
+ records
  expansion

当您以这种方式查看信息时,更容易理解。 新的符号集代替了字母数字输出,可帮助您快速识别两个文件之间的差异。

输出首先显示第一个文件,即 1.txt 及其从 1 到 5 的行。它表示文件 1.txt 的(部分)第 2 行和文件 2 的(部分)第 2 行有轻微变化。文本文件。

它还表示文件 1 的第 5 行已在第二个文件中被删除 (-)。

— 1,5 — 表示第二个文件的开始,表示第2行与文件1的第2行略有不同。也表示第4行在第二个文件中添加了(+),没有对应的文件 1 中的行。

示例 3:在“统一”上下文中使用 -u 进行区分

此选项提供类似于复制的上下文格式的输出。 它不是单独显示两个文件,而是将它们合并在一起。

christopher:~$ diff 1.txt 2.txt -u
--- 1.txt    2019-10-20 12:05:09.244673327 -0400
+++ 2.txt    2019-10-20 12:11:31.382547316 -0400
@@ -1,5 +1,5 @@
 cobweb
-locket
+LOCKET
 acoustics
+records
 expansion
-record

如您所见,它使用与以前相同的符号,但不是更改符号,而是建议使用易于阅读的方式进行更改 + 或者 - 符号。 在这里,它建议您删除第 2 行 1.txt 并将其替换为第 2 行 2.txt.

展望未来,它还建议您添加 记录 在包含声学的行和删除行之后 记录 在包含扩展的行之后。

所有这些更改都建议用于 diff 命令中的第一个文件。 这是另一种情况,它有助于记住 diff 程序使用列为“原始”或更正基础的第二个文件。

为了比较这样的列表,我个人觉得这种方法最容易使用。 它为您提供了需要更改的文本的清晰可视化,以使文件相同。

示例 4:使用 -i 比较但忽略案例

区分大小写的搜索是 diff 的默认设置,但您可以将其关闭。 让我们看看当你这样做时会发生什么。

christopher:~$ diff 1.txt 2.txt -i
3a4
> records
5d5
< record

如您所见,“locket”和“LOCKET”不再列为建议更改。

示例 5:使用 –color 进行区分

您可以使用 --color 突出显示 diff 命令输出中的更改。 运行命令时,输出部分将以不同颜色从终端调色板打印。

带颜色的 Diff 命令输出

示例 6:使用 diff 命令选项 -s 和 -q 快速分析文件

有几种简单的方法可以检查文件是否相同。 如果你使用 -s 它会告诉你文件是相同的,或者它会正常运行差异。

使用 -q 只会告诉你文件“不同”。 如果他们不这样做,您将不会得到任何输出。

christopher:~$ diff 1.txt 1.txt -s
Files 1.txt and 1.txt are identical
christopher:~$ diff 1.txt 2.txt -q
Files 1.txt and 2.txt differ

额外提示:在 Linux 中对大型文本文件使用 diff 命令

您可能并不总是比较如此简单的信息。 您可能需要扫描大型文本文件并找出其中的差异。我将详细介绍一些处理此类问题的方法。

为了这 example,我创建了两个带有大块文本的文件(lorem ipsum)。 每行有数百列。 这显然使比较线变得困难。

当在这样的文件上运行 diff 时,输出会生成大量文本,即使使用上下文输出等工具也很难看到符号。

为了节省空间,我截取了输出的屏幕截图供您查看。

带有大文本文件的 Diff 命令

不是很有帮助,是吗?

您可以使用一些相同的概念来分析这些类型的文件。 除非文件格式正确,否则它们将无法正常工作。 一些大文本块没有换行符。 您可能遇到过这样的文件,您需要在其中启用“Word Wrap”以便在不使用滚动条的情况下让所有文本显示在分配的空间内。 发生这种情况的原因是某些文本格式不会自动创建换行符。 这就是你最终得到只有 2-3 行的大块文本的方式。 有一个非常简单的解决方法。

使用 fold 将文本换行成行

这是 Linux 手册,所以自然而然地,我们为您提供了一个解决方案,我们可以在其中塞入一个迷你教程。这里有一篇关于 fold (Unix) 和 fmt (GNU) 的精彩文章。 我会快速的 example 尽管可以推动我们前进,但这应该是不言自明的。

fold 命令用于使用列数来换行。 可以对其进行定制,为您提供有关如何实施这些新换行符的选项。

在里面 example 在这里,您要将文件分成标准宽度并使用 -s 选项。 这告诉程序只在有空格的地方中断,而不是在文本中间。

使用 fold 快速插入换行符

fold -w 80 -s lorem.txt > lorem.txt
fold -w 80 -s lorem2.txt > lorem2.txt

将两个文件分成 31 行而不是 3 行,您可以更有效地比较它们。 这是一个 example 使用统一的上下文过滤器输出您的输出。

christopher:~$ diff lorem.txt 2lorem.txt -u
--- lorem.txt    2019-10-27 09:39:07.298691695 -0400
+++ 2lorem.txt    2019-10-27 09:39:08.370704501 -0400
@@ -1,10 +1,10 @@
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in tincidunt 
 sapien. Maecenas sagittis ex risus, in vehicula turpis imperdiet sed. Phasellus 
 placerat posuere maximus. In hac habitasse platea dictumst. Ut vel tristique 
-eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
+eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
 Suspendisse at mauris vitae sapien euismod tincidunt. Sed placerat finibus 
 blandit. Duis ornare ante at ipsum accumsan, nec bibendum nibh tincidunt. 
-Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
+Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
 vitae enim. Nam condimentum, purus nec semper efficitur, nisi quam vehicula 
 sem, eget finibus diam ipsum suscipit velit.

@@ -21,7 +21,7 @@

 Maecenas lacinia cursus tristique. Nulla a hendrerit orci. Donec lobortis nisi 
 sed ante euismod lobortis. Nullam sit amet est nec nunc porttitor sollicitudin 
-a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
+a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 
 interdum mi metus vel tellus. Fusce nec dui a risus posuere mattis at eu orci. 
 Proin purus sem, finibus eget viverra vel, porta pulvinar ex. In hac habitasse 
 platea dictumst. Nunc faucibus leo nec tristique porta. Phasellus luctus ipsum

将 diff 与 –minimal 输出一起使用

您可以使用 --minimal 标签。 这使得较大的文本文件更易于阅读。 让我们看看输出。

christopher:~$ diff lorem.txt 2lorem.txt --minimal
4c4
< eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
---
> eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
7c7
< Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
---
> Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
24c24
< a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
---
> a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 

您可以结合使用这些技巧中的任何一个或使用 diff 手册页中列出的其他一些选项。 这是一个功能强大且易于使用的软件实用程序。

我希望你觉得这篇文章有用。 如果您有小费,请不要忘记给我们留言并告诉我们。