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...
'0a1','2d2'和'4c4,5'是更改命令。
每个更改命令从左到右包含以下内容:
- 第一个文件中的行号或者行范围。
- 一个特殊的更改字符。
- 第二个文件中的行号或者行范围。
更改字符可以是以下之一:
- 'a'-添加行。
- 'c'-更改行。
- 'd'-删除行。
更改命令后跟已删除的完整行('<')并添加到文件('>')。
让我们解释一下输出:
- '0a1'-在file1的开头(在'0'之后)添加第二个文件的'1'行。
- '> Kubuntu'-如上所述,第二行中的行已添加到第一个文件中。
- '2d2'-删除第一个文件中的行'2'。 “ d”符号后的“ 2”表示如果未删除该行,它将出现在第二个文件的“ 2”行上。
- '<Arch Linux'-删除的行。
- '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...
- 'from-file-line-numbers'和'to-file-line-numbers'-第一个和第二个文件中的行号或者逗号分隔的行范围。
- 'from-file-line'和'to-file-line'-不同的行和上下文的行:
- 以两个空格开头的行是上下文行,这两个文件中的行相同。
- 以减号('-')开头的行是第二个文件中不包含任何内容的行。第二个文件中缺少行。
- 以加号('+')开头的行是第一个文件中不包含任何内容的行。第一个文件中缺少行。
- 以感叹号('!')开头的行是在两个文件之间更改的行。每行以“!”开头的行来自第一个文件的文件在第二个文件中具有相应的匹配项。
让我们解释输出中最重要的部分:
- 在此示例中,我们只有一节描述了差异。
- '*** 1,6 '和'--- 1,7 ----'告诉我们本节中包含的第一文件和第二文件的行范围。
- 这两个文件中的行'Ubuntu','Debian','Fedora'和最后一个空行是相同的。这些行以双倍空格开头。
- 第一个文件中的“-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到file-line-numbers @@'-此部分中包含的第一个和第二个文件的行号或者行范围。
- '文件行'-不同的行和上下文的行:
- 以两个空格开头的行是上下文行,这两个文件中的行相同。
- 以减号('-')开头的行是从第一个文件中删除的行。
- 以加号('+')开头的行是从第一个文件添加的行。
忽略大小写
我们可能在上面的示例中注意到,默认情况下,“ 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