Contents

比较Linux中的两个文件

1. 简介

我们经常想比较两个文本文件或比较同一文本文件的不同版本以识别差异。Linux 有diff 和*comm * 命令来满足这样的要求。

在本教程中,我们将学习使用diffcomm命令来比较两个文件。

2. 示例文件

让我们使用cat 命令查看示例文本文件的内容:

$ cat file1
The Tortoise and the Hare
The Boy Who Cried Wolf
Androcles and the Lion
$ cat file2
The Tortoise and the Hare
The Boy Who Cried Wolf
Androcles and the Lion
The Town Mouse and The Country Mouse
The Crow and the Pitcher

请注意,与file1相比, file2在末尾多了两行。

3. 比较文件

3.1. 使用diff命令

让我们应用diff命令来比较我们在上一节中创建的文件file1file2

$ diff -u file1 file2
--- file1	2021-08-31 23:25:50.000000000 +0100
+++ file2	2021-08-31 23:27:05.000000000 +0100
@@ -1,3 +1,5 @@
 The Tortoise and the Hare
 The Boy Who Cried Wolf
 Androcles and the Lion
+The Town Mouse and The Country Mouse
+The Crow and the Pitcher

在上面的输出中,我们看到了两个文件之间的统一差异。正如我们所知,file2最后多了两行。在输出中,我们看到那些行前面用**“+”突出显示的行。**在上面的命令中,由于 file1 出现在file2之前,diff命令从file1的角度比较文件。

现在,让我们颠倒diff命令中文件的顺序,看看输出是如何受到影响的。

$ diff -u file2 file1
--- file2	2021-08-31 23:27:05.000000000 +0100
+++ file1	2021-08-31 23:25:50.000000000 +0100
@@ -1,5 +1,3 @@
 The Tortoise and the Hare
 The Boy Who Cried Wolf
 Androcles and the Lion
-The Town Mouse and The Country Mouse
-The Crow and the Pitcher

正如我们在输出中看到的,从file2的角度来看,file1少了两行,如行前面的**“-”所示。**

文件的顺序和diff的结果可能会令人困惑。为避免混淆,记住结果的一种简单方法是了解文件的顺序。例如,如果我们有这样的diff命令:

diff -u FILE1 FILE2

那么,如果结果有

  • ‘+’ 在行前,该行只在FILE2
  • ‘-’ 在该行的前面,该行只在FILE1

3.2. 使用comm命令

让我们使用comm命令比较文件。comm命令逐行比较文件。

$ comm [OPTION] FILE1 FILE2

comm命令有 3 个选项*-1*、-2-3。不带选项的命令产生三列输出。第 1 列包含 FILE1 独有的行,第 2 列包含 FILE2 独有的行,第 3 列包含两个文件共有的行。当我们分别提供选项123时, comm命令会抑制相应的列。

例如,让我们运行comm命令来查看file1中的唯一行:

$ comm -23 file1 file2

file1中没有唯一的行,因此上面的输出是空白的。-23选项保留第 1 列,其中包含file1独有的行,并隐藏第 2 列和第 3 列。

同样,让我们使用以下命令查看file2中的唯一行,这里*-13*分别抑制第 1 列和第 3 列的输出:

$ comm -13 file1 file2
The Town Mouse and The Country Mouse
The Crow and the Pitcher

正如我们所知,file2file1多两行。我们将这两行视为输出。

4. 比较文件——仅查找添加内容

假设我们想比较两个文件,只看它们之间的相加。让我们为这个用例应用diff命令。基于我们上面创建的文件,让我们运行以下命令:

$ diff -u file2 file1 | sed -n '/^+[^+]/ s/^+//p'

在这里,我们应用带有diff命令的sed 来转换 diff 的输出以仅显示添加的行。Linux 中的sed命令扩展为流编辑器。它使用只有一个“+”的模式查找diff的输出,并将该行中的“+”替换为空字符并打印它。因为从file2的角度我们知道file1没有任何新的添加,所以我们在输出中看不到任何添加的行。

同样,让我们使用comm命令尝试相同的用例:

comm -23 file1 file2

在这里,由于file1中没有唯一的行,我们得到空白输出。

5. 比较文件——只查找删除

现在,让我们看看相反的用例,只显示这些文件中删除的行。

$  diff -u file2 file1 | sed -n '/^-[^-]/ s/^-//p'
The Town Mouse and The Country Mouse
The Crow and the Pitcher

与上一节类似,这里我们查看diff命令的输出,对于只有一个 ‘-’ 的行,将 ‘-’ 替换为空字符并打印它。正如我们所知,从file2的角度来看, file1少了两行,我们在输出中看到了它们。

我们也可以使用comm命令找到删除的行:

$ comm -13 file1 file2
The Town Mouse and The Country Mouse
The Crow and the Pitcher

由于在上面的命令中第 1 列和第 3 列被抑制,我们看到了file2独有的行。