云网牛站
所在位置:首页 > Linux命令 > 在Linux系统中使用Diff命令,讲解普通/上下文/统一格式及忽略大小写

在Linux系统中使用Diff命令,讲解普通/上下文/统一格式及忽略大小写

2019-11-26 09:23:45作者:秦风稿源:云网牛站

本文介绍在Linux操作系统中使用Diff命令的方法,同时讲解普通/上下文/统一格式及忽略大小写知识。diff是一个命令行实用程序,可让你逐行比较两个文件,它还可以比较目录的内容。diff命令最常用于创建一个补丁,其中包含可以使用patch命令应用的一个或多个文件之间的差异。

在Linux系统中使用Diff命令,讲解普通/上下文/统一格式及忽略大小写

 

如何使用diff命令

diff命令的语法如下:

diff [OPTION]... FILES

参考:diff命令_Linux diff命令使用详解:比较给定的两个文件的不同

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

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

diff file1 file2 > patch

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

1、file1:

Ubuntu

Arch Linux

Debian

CentOS

Fedora

2、file2:

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...

0a1、2d2和4c4,5是更改命令,每个更改命令从左到右包含以下内容:

第一个文件中的行号或行范围。

一个特殊的更改字符。

第二个文件中的行号或行范围。

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

a-添加行。

c-更改行。

d-删除行。

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

让我们解释一下输出:

1、0a1-在file1的开头(第0行之后)添加第二个文件的第1行。

> Kubuntu-如上所述,第二行中的行添加到第一个文件中。

2、2d2-删除第一个文件中的第2行,d符号后的2表示如果未删除该行,它将出现在第二个文件的第二行。

< Arch Linux-删除的行。

3、4c4,5-用第二个文件中的4-5行替换(更改)第一个文件中的第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...

1、from-file-line-numbers和to-file-line-numbers-第一个文件和第二个文件中的行号或逗号分隔的行范围。

2、from-file-line和to-file-line-不同的行和上下文的行:

以两个空格开头的行是上下文行,这两个文件中的行相同。

以减号(-)开头的行是第二个文件中不包含任何内容的行,第二个文件中缺少行。

以加号(+)开头的行是第一个文件中不包含任何内容的行,第一个文件中缺少行。

以感叹号(!)开头的行是在两个文件之间更改的行,每行以!开头来自第一个文件的文件在第二个文件中具有相应的匹配项。

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

1、在此示例中,我们只有一节描述了差异。

2、*** 1,6 ****和--- 1,7 ----告诉我们本节中包含的第一文件和第二文件的行范围。

3、行Ubuntu,Debian,Fedora和最后一个空行在两个文件中都相同,这些行以双倍空格开头。

4、行-第一个文件中的Arch Linux与第二个文件中的任何内容都不对应,尽管第二行中也存在此行,但是位置不同。

5、第二个文件中的Line + Kubuntu对应于第一个文件中的任何内容。

6、行! 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...

1、@@从文件行号到文件行号@@-本节中包含的第一个和第二个文件的行号或行范围。

2、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命令查看。

 

相关主题

终端环境下更好用的文件比较差异工具:icdiff

Linux命令子频道
精选文章
热门文章