在 Linux 终端中使用 Diff 命令比较两个文件
当您需要在 Linux 中比较两个包含相似文本的文件时,使用diff 命令可以让您的任务变得更容易。该命令会比较两个文件,并建议进行更改以使文件相同。非常适合查找破坏您新更新的代码的额外花括号。
使用 diff 命令非常简单。语法如下:
diff [options] file1 file2
但理解它的输出又是另一回事。别担心,我会解释输出,以便您可以比较两个文件并了解它们之间的区别。
了解 Linux 中的 diff 命令
您需要一些文件才能开始。我使用随机单词生成器生成了一个列表。
我将列表添加到两个不同的文件中,然后通过以下方式修改列表:
- 更改列表顺序
- 添加字母
- 切换案例
我将这些相似的文件保存为 1.txt 和 2.txt。在执行任何操作之前,它们看起来是这样的。
我建议您在阅读时按照教程进行操作,因此请创建新文件并向其中添加以下内容。
1.txt的内容:
蛛网
小盒
声学
扩展
记录
2.txt内容:
蛛网
LOCKET
声学
唱片
扩张
示例 1:不带选项的 Diff
让我们看看当你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 命令输出中的重要符号
使用下表作为参考,您可以更好地了解终端中发生的情况。
象征 | 意义 |
---|---|
一个 | 添加 |
碳 | 改变 |
德 | 删除 |
# | 行号 |
– – – | 输出中分隔文件 |
< | 文件 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 行删除文本“record”。这样文件 1.txt 将与文件 2.txt 匹配 |
该命令没有内置拼写检查或词典功能。它不认为“record”和“records”相关。它的唯一目标是完美匹配这两个文件。
从输出结果来看,翻译起来还是相当困难的。你不太可能节省很多时间。
幸运的是,可以添加一些选项来让内容更易于阅读。让我们看看使用相同列表的几个不同示例。
示例 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.txt 的第 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 命令输出中的更改。运行该命令时,输出的各个部分将以与终端调色板不同的颜色打印。
示例 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 来比较目录。
希望您觉得这篇文章有用。如果您有小窍门,请不要忘记给我们留言并告诉我们。