如何在Linux终端中比较两个文本文件

需要查看文本文件的两个修订版之间的差异吗?那么diff就是您需要的命令。本教程将向您展示如何在Linux和MacOS上使用diff,这是一种简单的方法。

潜入差异化

diff命令比较两个文件并生成两个文件之间的差异列表。更准确地说,它生成需要对第一个文件进行更改的列表,以使其与第二个文件匹配。如果您牢记这一点,您会发现更容易理解diff的输出。diff命令旨在找出源代码文件之间的差异,并生成其他程序(如patch命令)可以读取和操作的输出。在本教程中,我们将了解使用diff的最有用、最人性化的方式。

让我们直接开始分析两个文件。命令行上文件的顺序决定了哪个文件diff认为是“第一个文件”,哪个文件被认为是“第二个文件”。在下面的示例中,alpha1是第一个文件,alpha2是第二个文件。这两个文件都包含语音字母表,但是第二个文件alpha2进行了一些进一步的编辑,因此这两个文件并不相同。

我们可以使用此命令比较文件。键入diff、空格、第一个文件的名称、空格、第二个文件的名称,然后按Enter键。

diff alpha1 alpha2

我们如何分析这些输出呢?一旦你知道要找什么,事情就没那么糟糕了。每个差异在单列中依次列出,并且每个差异都有标签。标签在字母的两边都包含数字,如4C4。第一个数字是字母1中的行号,第二个数字是字母2中的行号,中间的字母可以是:

C:需要更改第一个文件中的行以匹配第二个文件中的行。 D:必须删除第一个文件中的行才能与第二个文件匹配。 答:必须向第一个文件添加额外的内容,使其与第二个文件匹配。

我们示例中的4c4告诉我们必须改变alpha1的第四行以匹配alpha2的第四行。这是diff发现的两个文件之间的第一个差异。

以<开头的行是指第一个文件(在我们的示例中是alpha1),以>开头的行是指第二个文件(Alpha2)。<Delta行告诉我们单词Delta是alpha1中第四行的内容。>Dave行告诉我们单词Dave是字母2中第四行的内容。综上所述,我们需要在alpha1的第4行用Dave替换Delta,以使该行在两个文件中都匹配。

下一个变化由12C12指示。应用相同的逻辑,这告诉我们alpha1的第12行包含单词lima,但是alpha2的第12行包含单词linux。

第三个变化指的是从字母2中删除的一行。标签21d20被解码为“需要从第一个文件中删除第21行,以使两个文件从第20行开始同步。”<Uniform 1行向我们显示了需要从alpha1中删除的行的内容。

第四个差异被标记为26a26,28。此更改涉及已添加到alpha2的额外三行。注意标签上的26,28个字母。由逗号分隔的两行数字表示行号范围。在本例中,范围是从第26行到第28行。标签被解释为“在第一个文件的第26行,添加来自第二个文件的第26到28行”。我们看到了alpha2中需要添加到alpha1的三行。其中包含怪诞、奇异和魅力等词。

时髦的俏皮话

如果您只想知道两个文件是否相同,请使用-s(报告相同的文件)选项。

diff -s alpha1 alpha3

您可以使用-q(Brief)选项来获得关于两个文件不同的同样简洁的语句。

diff -q alpha1 alpha2

需要注意的一件事是,对于两个完全相同的文件,-q(Brief)选项完全沉默,并且根本不报告任何内容。

另一种观点

y(并排)选项使用不同的布局来描述文件差异。通常,在并排视图中使用-W(宽度)选项可以方便地限制显示的列数。这避免了难看的环绕行,使输出难以阅读。在这里,我们告诉diff生成并排显示,并将输出限制为70列。

diff -y -W 70 alpha1 alpha2

命令行上的第一个文件alpha1显示在左侧,命令行上的第二行alpha2显示在右侧。每个文件中的行将并排显示。在alpha2中已更改、删除或添加的行旁边有指示符。

|:第二个文件中已更改的行。 <:已从第二个文件中删除的行。 >:添加到第二个文件但不在第一个文件中的行。

如果您希望对文件差异进行更紧凑的汇总,可以使用--suppress-common-line选项。这会强制diff仅列出更改、添加或删除的行。

diff -y -W 70 --suppress-common-lines alpha1 alpha2

添加飞溅的颜色

另一个名为Colordiff的实用程序将颜色突出显示添加到diff输出。这使得查看哪些行有差异变得容易得多。

如果您使用的是Ubuntu或其他基于Debian的发行版,请使用aapt-get命令将此软件包安装到您的系统上。在其他Linux发行版上,请改用您的Linux发行版的包管理工具。

sudo apt-get install colordiff

像使用diff一样使用Colordiff。

实际上,color diff是diff的包装器,diff完成了幕后的所有工作。正因为如此,所有的diff选项都将与Colordiff一起使用。

提供一些上下文

要在屏幕上显示文件中的所有行和只列出更改的行之间找到一些折衷方法,我们可以要求diff提供一些上下文。有两种方法可以做到这一点。这两种方式都实现了相同的目的,即在每个更改的行之前和之后显示一些行。您将能够在检测到差异的位置看到文件中正在发生的事情。

第一种方法使用-c(复制的上下文)选项。

colordiff -c alpha1 alpha2

diff输出有一个标题。标题列出了这两个文件名及其修改时间。第一个文件的名称前有星号(*),第二个文件的名称前有破折号(-)。星号和破折号将用于指示输出中的行属于哪个文件。

中间有1,7的星号线表示我们看到的是字母1中的线。准确地说,我们看到的是1到7行。单词Delta被标记为已更改。它有一个感叹号(!)。在它旁边,它是红色的。在该行之前和之后显示了三行未更改的文本,因此我们可以在文件中看到该行的上下文。

中间有1,7的虚线告诉我们,我们现在看到的是字母2中的线条。同样,我们看的是第一到第七行,第四行的单词Dave被标记为不同。

每个更改上下三行上下文是默认值。您可以指定希望diff提供多少行上下文行。为此,请使用带有大写“C”的-C(复制的上下文)选项,并提供所需的行数:

colordiff -C 2 alpha1 alpha2

提供上下文的第二个不同选项是-u(统一上下文)选项。

colordiff -u alpha1 alpha2

和前面一样,我们在输出上有一个标题。这两个文件被命名,并显示了它们的修改时间。字母1的名称前有破折号(-),字母2的名称前有加号(+)。这告诉我们,破折号将用于表示字母1,加号将用于表示字母2。列表中散布着以at符号(@)开头的行。这些线标记每个差异的开始。它们还告诉我们每个文件显示了哪些行。

我们会看到被标记为不同的行之前和之后的三行,这样我们就可以看到更改行的上下文。在统一视图中,有差异的线条显示在另一条线的上方。来自alpha1的行前面有破折号,来自alpha2的行前面有加号。此显示在8行内完成了上面复制的上下文显示需要15行才能完成的工作。

如您所料,我们可以要求diff提供我们希望看到的统一上下文行数。为此,请使用-U(统一上下文)选项,并提供您想要的行数:

colordiff -U 2 alpha1 alpha2

忽略空格和大小写

让我们分析另外两个文件test4和test5。上面有六个超级英雄的名字。

colordiff -y -W 70 test4 test5

结果显示,迪夫与《黑寡妇》、《蜘蛛侠》和《雷神》的台词没有什么不同。它确实标志着美国队长、铁人三项和绿巨人路线的变化。

那么有什么不同呢?嗯,在测试5中,绿巨人的拼写是小写的“h”,“美国队长”和“美国”之间有额外的空格。好的,这是显而易见的,但是铁人三项线路有什么问题呢?没有明显的区别。这里有一个很好的经验法则。如果您看不见,答案是空白。几乎可以肯定的是,该行末尾有一两个空格或制表符。

如果它们对您无关紧要,您可以指示diff忽略特定类型的行差,包括:

-i:大小写时忽略差异。 -Z:忽略尾随空格。 -b:忽略空白量的更改。 -w:忽略所有空格更改。

让diff再次检查这两个文件,但这一次忽略任何差异以防万一。

colordiff -i -y -W 70 test4 test5

带有“the hulk”和“the hulk”的行现在被认为是匹配的,并且没有小写“h”的区别。让我们让diff也忽略尾随空格。

colordiff -i -Z -y -W 70 test4 test5

正如所怀疑的那样,尾随空格一定是铁人三项线上的不同之处,因为diff不再标记该线的不同之处。那就只剩下美国队长了。让我们要求diff忽略大小写并忽略所有空格问题。

colordiff -i -w -y -W 70 test4 test5

通过告诉diff忽略我们并不关心的差异,diff告诉我们,出于我们的目的,文件是匹配的。

diff命令有更多选项,但大多数选项与生成机器可读输出有关。可以在Linux手册页上查看这些内容。我们在上面的示例中使用的选项将使您能够使用命令行和人工眼球跟踪文本文件版本之间的所有差异。

相关文章