Linux diff命令

时间:2019-04-29 03:17:27  来源:igfitidea点击:

使用diff和sdiff比较文件

diff命令

diff命令用于逐行比较文件。diff命令的常规语法如下:

diff file1 file2

基本上,diff描述了需要对file1进行哪些更改才能与file2的内容匹配。

当您运行diff命令时,各种描述性键用于描述需要应用的差异。以下是这些描述符的列表:

描述键说明
a新增
c有修改
d被删除
<文件1
>文件2

演示diff命令的最简单方法是通过示例。

diff命令示例1

以下是两个文件(filea和fileb),这些文件的内容已使用cat命令显示:

john@ubuntu01-pc:~/test$ cat filea
I am line one of this test
I am line two of this test
I am line three of this test
I am line four of this test

john@ubuntu01-pc:~/test$ cat fileb
I am line one of this test
I am not line two
I am not line three
I am not line four

diff命令的输出:

john@ubuntu01-pc:~/test$ diff filea fileb
2,4c2,4
< I am line two of this test
< I am line three of this test
< I am line four of this test
---
> I am not line two
> I am not line three
> I am not line four
  1. diff输出的第一行包含:
    对应于第一个文件的行号, 描述符(a表示添加,c表示更改,d表示删除),以及对应于第二个文件的行号。
    从上面的输出中,输出了描述性信息2,4c2,4。这个描述性输出表示:

为了与第二个文件的2-4行匹配,需要更改第一个文件中的2-4行。然后显示每个文件中每一行的描述。

  1. 以<为前缀的行是第一个文件中的行。(filea)

  2. 以>为前缀的行是第二个文件中的行。(fileb)

  3. 输出(---)之间的三个破折号分隔了file 1file 2的行。

diff命令 并排比较

显示diff命令输出的另一种方法是传递-y标志。此标志对应于并排比较:

john@ubuntu01-pc:~/test$ diff -y filea fileb
I am line one of this test					I am line one of this test
I am line two of this test				      |	I am not line two
I am line three of this test				      |	I am not line three
I am line four of this test				      |	I am not line four

进行并排比较的另一种方法是使用命令sdiff

john@ubuntu01-pc:~/test$ sdiff filea fileb
I am line one of this test					I am line one of this test
I am line two of this test				      |	I am not line two
I am line three of this test				      |	I am not line three
I am line four of this test				      |	I am not line four

diff命令示例2

john@ubuntu01-pc:~/test$ cat file1
I like Arch Linux
I like Ubuntu
I like Debian

john@ubuntu01-pc:~/test$ cat file2
I like Arch Linux
I like Ubuntu
I like Debian
I like CentOS

上面文件的diff命令输出:

john@ubuntu01-pc:~/test$ diff file1 file2
3a4
> I like CentOS

从上面的输出中我们可以看到,在第3行之后,需要添加一行。(对应第二个文件中的第4行。)然后显示是哪一行。

diff命令示例3

john@ubuntu01-pc:~/test$ cat filec
I am line one
I am line two
I am line three
I am line four

john@ubuntu01-pc:~/test$ cat filed
I am line one
I am line two
I am line three

diff命令的输出:

john@ubuntu01-pc:~/test$ diff filec filed
4d3
< I am line four

输出告诉我们:删除第一个文件中的第4行,以便两个文件在第3行同步。然后显示需要删除的行的内容。

带有-y参数的diff命令的输出:

john@ubuntu01-pc:~/test$ diff -y filec filed
I am line one							I am line one
I am line two							I am line two
I am line three							I am line three
I am line four						      <

diff命令示例4

Linux 如何快速比较两个目录的内容

john@ubuntu01-pc:~$ ls dir*
dira:
file1  file2  file3  file4

dirb:
file1  file2  file4

diff目录比较的输出:

john@ubuntu01-pc:~$ diff dira dirb
Only in dira: file3

从上面可以看到,只有目录dira具有文件file3

上下文和统一模式

正如我们在前面的示例中看到的,diff命令可以很容易地识别文件和目录之间的差异。
但是,在较大的文件中生成的输出并不总是那么容易理解。diff命令有两种不同的模式。这些模式是上下文模式和统一模式。

上下文模式

要在上下文模式下使用diff命令,请传递-c标志。

语法

diff -c file1 file2 

文件的内容

john@ubuntu01-pc:~/test$ cat filec
I am line one
I am line two
I am line three
I am line four

john@ubuntu01-pc:~/test$ cat filed
I am line one
I am line two
I am line three

上下文模式中的diff输出:

john@ubuntu01-pc:~/test$ diff -c filec filed
*** filec	2014-11-11 20:28:06.225478584 +0000
--- filed	2014-11-11 20:28:28.769478124 +0000
***************
*** 1,4 ****
  I am line one
  I am line two
  I am line three
- I am line four
--- 1,3 ----

输出的前两行向我们显示有关文件(filec)和文件(filed)的信息。

它列出了文件的名称,其修改日期和每个文件的修改时间文件由***指示,文件由---指示。

*************行是一个分隔符字段。

下一行具有三个星号(***),后跟第一个文件的行范围(在本例中为第1-4行,用逗号分隔)。然后是四个星号(****

然后,它向我们显示了这些行的内容。如果该行未更改,则仅以两个空格作为前缀。如果更改了该行,则会以字符和一个空格作为前缀。

下表描述了这些字符的含义:

字符描述
表示一行是一个或多个需要更改的一行的一部分。在另一个文件的上下文中,也有一组对应的行以!为前缀。
+指示第二个文件中需要添加到第一个文件中的这一行。
--指示第一个文件中需要删除的一行。

在第一个文件的行之后,有三个破折号(---),然后是一个行范围,然后是四个破折号(----)。这表示将与第一个文件中的更改同步的第二个文件中的行范围。

统一模式

要在统一模式下使用diff命令,只需传递-u参数。统一模式类似于上下文模式,但是它更紧凑,因为它忽略了冗余信息。

在下面的示例中,我们使用与上一个示例相同的文件:

使用统一模式 diff命令的输出

john@ubuntu01-pc:~/test$ diff -u filec filed
--- filec	2014-11-11 20:28:06.225478584 +0000
+++ filed	2014-11-11 20:28:28.769478124 +0000
@@ -1,4 +1,3 @@
 I am line one
 I am line two
 I am line three
-I am line four

输出类似于上下文示例,但差异被统一为一组。