如何在 Linux 中使用 Diff 命令 [输出解释]如何在 Linux 中使用 Diff 命令 [输出解释]如何在 Linux 中使用 Diff 命令 [输出解释]如何在 Linux 中使用 Diff 命令 [输出解释]
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

如何在 Linux 中使用 Diff 命令 [输出解释]

发表 admin at 2025年2月28日
类别
  • 未分类
标签

diff 命令非常适合在 Linux 终端中比较两个文件。但它的输出可能会非常复杂。我们通过解释 diff 命令输出来使事情变得简单。

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

使用 diff 命令非常简单。语法如下:

diff [options] file1 file2

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

了解 Linux 中的 diff 命令

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

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

  • 更改列表顺序

  • 添加字母

  • 切换案例

我将这些类似的文件另存为 1.txt 和 2.txt。这是您执行任何操作之前它们的样子。

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

1.txt的内容:

蛛网
挂坠盒
声学
扩展
记录

2.txt的内容:

蜘蛛网
LOCKET
声学
记录
扩展

示例 1:不带选项的差异

让我们看看当您运行不带任何选项的 diff 命令时会发生什么。

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

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

了解分析完成后,file2 [在语法中] 被视为您正在尝试的参考文档可能会有所帮助来匹配。所以,你可能会说 diff 是这样工作的:

diff <file_to_edit> <file_as_reference>

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

顺序很重要

输出如何因文件顺序而异的示例:

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 命令输出中的重要符号

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

A

添加

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

将“locket”更改为“LOCKET”以匹配文件2.txt

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

3a4

在文件 1 的第 3 行之后,添加文件 2 的第 4 行。

> records

即在文件1中添加“records”创建第4行。这样文件1.txt将匹配文件2.txt

相似地:

5d5 < record

删除文件1第5行的“record”文本。这样文件1.txt将匹配文件2.txt

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

从输出结果来看,翻译起来还是相当困难的。您不太可能节省很多时间。

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

示例 2:使用 -c 在“已复制”上下文中进行差异

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

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 行(部分)有轻微变化。TXT。

它还表示文件 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

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

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

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

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

示例 4:使用 -i 比较但忽略大小写

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

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

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

示例 5:使用 –color 进行比较

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

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

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

使用 -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 命令处理大型文本文件

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

对于此示例,我创建了两个包含大文本块的文件 (lorem ipsum)。每行有数百列。这显然使得比较线条变得困难。

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

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

不太有帮助,是吗?

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

使用折叠将文本换行

这是 Linux 手册,所以我们自然会为您提供一个解决方案,并且我们可以塞进一个迷你教程。这里有一篇关于 Fold (Unix) 和 fmt (GNU) 的精彩文章。我将给出一个简单的例子,它应该是不言自明的,但可以推动我们前进。

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

在此示例中,您将把文件分成标准化宽度并使用 -s 选项。这告诉程序仅在有空格的地方中断,而不是在文本中间中断。

使用折叠快速插入换行符

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

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

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 手册页中列出的一些其他选项。这是一个功能强大且易于使用的软件实用程序。

结论

diff 的使用不仅限于文件。您还可以使用 diff 来比较目录。

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

©2015-2025 Norria support@norria.com