Linux中的Diff命令

diff 是一个命令行实用程序,可让您逐行比较两个文件。 它还可以比较目录的内容。

diff 该命令最常用于创建一个补丁,其中包含可以使用以下命令应用的一个或多个文件之间的差异。 patch 命令。

如何使用 diff 命令#

的语法 diff 命令如下:

diff [OPTION]... FILES

diff 命令可以以几种格式显示输出,其中最常用的是普通,上下文和统一格式。 输出包括有关必须更改文件中的哪些行以使它们变得相同的信息。 如果文件匹配,则不产生任何输出。

要将命令输出保存到文件,请使用重定向运算符:

diff file1 file2 > patch

在本文中,我们将使用以下两个文件来说明 diff 命令工作:

文件1

Ubuntu
Arch Linux
Debian
CentOS
Fedora

文件2

Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora

普通格式

以最简单的形式 diff 命令在两个文本文件上运行,没有任何选项,它将以正常格式生成输出:

diff file1 file2

输出将如下所示:

0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos

普通输出格式由一个或多个描述差异的部分组成。 每个部分如下所示:

change-command
< from-file-line...
---
> to-file-line...

0a12d24c4,5 是更改命令。 每个更改命令从左到右包含以下内容:

  • 第一个文件中的行号或行范围。
  • 一个特殊的更改字符。
  • 第二个文件中的行号或行范围。

更改字符可以是以下之一:

  • a -添加行。
  • c -换行。
  • d -删除行。

更改命令后跟已删除的完整行(<)并添加到文件(>)。

让我们解释一下输出:

  • 0a1 -添加行 1 第二个文件在文件1开头的位置(在该行之后) 0)。
    • > Kubuntu -如上所述,将第二行中的行添加到第一个文件中。
  • 2d2 -删除行 2 在第一个文件中。 的 2 之后 d 符号表示如果不删除该行,它将显示在行上 2 在第二个文件中。
    • < Arch Linux -删除的行。
  • 4c4,5 -更换(更改)线 5 在第一个带有行的文件中 4-5 从第二个文件。
    • < CentOS -第一个文件中要替换的行。
    • --- – 分隔器。
    • > Arch Linux> Centos -第二个文件中的行替换了第一个文件中的行。

上下文格式

使用上下文输出格式时, diff 命令在文件之间不同的行周围显示几行上下文。

-c 选项告诉 diff 以上下文格式产生输出:

diff -c file1 file2
*** file1	2019-11-25 21:00:26.422426523 +0100
--- file2	2019-11-25 21:00:36.342231668 +0100
***************
*** 1,6 ****
  Ubuntu
- Arch Linux
  Debian
! CentOS
  Fedora
  
--- 1,7 ----
+ Kubuntu
  Ubuntu
  Debian
! Arch Linux
! Centos
  Fedora

如果比较了文件,则输出以名称和时间戳开始,以及一个或多个描述差异的部分开始。 每个部分如下所示:

***************
*** from-file-line-numbers ****
  from-file-line...
--- to-file-line-numbers ----
  to-file-line...
  • from-file-line-numbersto-file-line-numbers -第一个文件和第二个文件中的行号或以逗号分隔的行范围。
  • from-file-lineto-file-line -不同的线和上下文的线:
    • 以两个空格开头的行是上下文行,这两个文件中的行相同。
    • 以减号(-)是与第二个文件中的任何内容都不对应的行。 第二个文件中缺少行。
    • 以加号(+)是与第一个文件中的任何内容都不对应的行。 第一个文件中缺少行。
    • 以感叹号(!)是在两个文件之间更改的行。 每行以 ! 来自第一个文件的文件在第二个文件中具有相应的匹配项。

让我们解释输出中最重要的部分:

  • 在此示例中,我们只有一节描述了差异。
  • *** 1,6 ****--- 1,7 ---- 告诉我们本节中包含的第一个文件和第二个文件中的行范围。
  • 线数 UbuntuDebianFedora和,最后一个空行在两个文件中都相同。 这些行以双倍空格开头。
  • 线 - Arch Linux 从第一个文件开始对应于第二个文件中的任何内容。 尽管第二行中也存在此行,但是位置不同。
  • 线 + Kubuntu 来自第二个文件的内容与第一个文件中的内容不对应。
  • 线 ! CentOS 从第一个文件和行开始 ! Arch Linux! CentOS 从第二个文件中更改文件之间。

默认情况下,上下文行的数量默认为三。 要指定其他数字,请使用 -C--contexts) 选项:

diff -C 1 file1 file2
*** file1	2019-11-25 21:00:26.422426523 +0100
--- file2	2019-11-25 21:00:36.342231668 +0100
***************
*** 1,5 ****
  Ubuntu
- Arch Linux
  Debian
! CentOS
  Fedora
--- 1,6 ----
+ Kubuntu
  Ubuntu
  Debian
! Arch Linux
! Centos
  Fedora

统一格式

统一输出格式是上下文格式的改进版本,并产生较小的输出。

使用 -u 选择告诉 diff 以统一格式打印输出:

diff -u file1 file2
--- file1	2019-11-25 21:00:26.422426523 +0100
+++ file2	2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
 Ubuntu
-Arch Linux
 Debian
-CentOS
+Arch Linux
+Centos
 Fedora

输出以文件的名称和时间戳以及描述差异的一个或多个部分开始。 每个部分采用以下形式:

***************
@@ from-file-line-numbers to-file-line-numbers @@
 line-from-files...
  • @@ from-file-line-numbers to-file-line-numbers @@ -本节中包含的第一个和第二个文件的行号或行范围。
  • line-from-files -不同的线和上下文的线:
    • 以两个空格开头的行是上下文行,这两个文件中的行相同。
    • 以减号(-)是 已移除 从第一个文件开始。
    • 以加号(+)是 添加 从第一个文件开始。

忽略案例

您可能在以上示例中注意到, diff 默认情况下,命令区分大小写。

使用 -i 选择告诉 diff 忽略大小写:

diff -ui file1 file2
--- file1	2019-11-25 21:00:26.422426523 +0100
+++ file2	2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
 Ubuntu
-Arch Linux
 Debian
+Arch Linux
 CentOS
 Fedora

结论#

比较文本文件之间的差异是Linux系统管理员最常见的任务之一。

diff 命令逐行比较文件。 有关更多信息,请键入 man diff 在您的终端中。

如有任何疑问,请在下面发表评论。

差异终端

Sidebar