Linux diff命令
使用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
- diff输出的第一行包含:
对应于第一个文件的行号
, 描述符(a表示添加,c表示更改,d表示删除),以及对应于第二个文件的行号。
从上面的输出中,输出了描述性信息2,4c2,4
。这个描述性输出表示:
为了与第二个文件的2-4
行匹配,需要更改第一个文件中的2-4行
。然后显示每个文件中每一行的描述。
以<为前缀的行是第一个文件中的行。(filea)
以>为前缀的行是第二个文件中的行。(fileb)
输出(
---
)之间的三个破折号分隔了file 1
和file 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
输出类似于上下文示例
,但差异被统一
为一组。