Linux命令行文本处理工具 [LinuxCast视频教程]
目录:
diff
是一个命令行实用程序,可让您逐行比较两个文件。 它还可以比较目录的内容。
diff
命令最常用于创建一个补丁,其中包含可以使用
patch
命令应用的一个或多个文件之间的差异。
如何使用
diff
命令
diff
命令的语法如下:
diff… FILES
diff
命令可以以几种格式显示输出,其中最常见的是普通,上下文和统一格式。 输出包含有关文件中哪些行必须更改以使它们变得相同的信息。 如果文件匹配,则不产生任何输出。
要将命令输出保存到文件,请使用重定向运算符:
diff file1 file2 > patch
,我们将使用以下两个文件来说明
diff
命令的工作方式:
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
和
4c4, 5
是更改命令。 每个更改命令从左到右包含以下内容:
- 第一个文件中的行号或行范围。特殊的更改字符。第二个文件中的行号或行范围。
更改字符可以是以下之一:
- a-添加行。
c更改行。d删除行。
更改命令后跟已删除的完整行(
<
)并添加到文件(
>
)。
让我们解释一下输出:
-
0a1在file1的开头(第0行之后)添加第二个文件的第1行。-
> Kubuntu如上所述,第二行中的行添加到第一个文件中。
2d2删除第一个文件中的第2行。d符号后的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-numbersnumbers-第一个文件和第二个文件中的行号或逗号分隔的行范围。from-file-line和to-file-line-不同的行和上下文的行:- 以两个空格开头的行是上下文行,这两个文件中的行都相同。以减号(
-)开头的行是第二个文件中不包含任何内容的行。 第二个文件中缺少的行。以加号(+)开头的行是与第一个文件中没有任何内容相对应的行。 第一个文件中缺少的行。以感叹号(!)开头的行是在两个文件之间更改的行。 每行以!开头 来自第一个文件的文件在第二个文件中具有相应的匹配项。
- 以两个空格开头的行是上下文行,这两个文件中的行都相同。以减号(
让我们解释输出中最重要的部分:
- 在此示例中,我们只有一节描述了差异。
*** 1, 6 ****和--- 1, 7 ----告诉我们本节中包含的第一个和第二个文件的行范围。行Ubuntu,Debian,Fedora和两个文件中的最后一个空行相同。 这些行以双倍空格开头。Line-第一个文件中的- Arch Linux与第二个文件中的任何内容都不对应。 尽管第二行中也存在此行,但位置不同。第二个文件中的Line+ Kubuntu对应于第一个文件中的任何内容! CentOS! CentOS从第一个文件开始! Arch Linux! Arch Linux和! CentOS第二个文件中的! 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
。







