每天一个Linux命令(31)diff命令

Posted MenAngel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个Linux命令(31)diff命令相关的知识,希望对你有一定的参考价值。

    diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

    (1)用法:

    用法:  diff  [选项参数]  [文件1或目录1] [文件2或目录2]

 

    (2)功能:

    功能:  diff命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。

 

    (3)选项参数:

      1) -y  --side-by-side            以并列的方式显示文件的异同之处。

      2) -W --width                在使用-y参数时,指定栏宽。

      3) -c                    显示全部内文,并标出不同之处。

      4) -u -U --unified              以合并的方式来显示文件内容的不同。

      5) -r --recursive              比较子目录中的文件

      6) -n --rcs                 将比较结果以RCS的格式来显示。

 

    (4)实例:

      1)[[email protected] Document]# diff t1.txt t2.txt        比较两个文档的区别

[[email protected] Document]# cat >t1.txt <<EOF   //第一种新建文档的方式
> this is a text!
> 
> Name is t1.txt!
> The extra content!
> I am MenAngel!
> EOF
[[email protected] Document]# cat >t2.txt        //第二种新建文档的方式
this is a text!

Name is t2.txt!
^Z
[2]+  已停止               cat > t2.txt       //按ctrl+z键停止
[[email protected] Document]# diff ../Document/t1.txt ../Document/t2.txt    diff后的两个文件参数可以跟相对路径也可以跟绝对路径
3,5c3                                  
< Name is t1.txt!
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!
[[email protected] Document]# diff t1.txt t2.txt
3,5c3
< Name is t1.txt!
< The extra content!
< I am MenAngel!
---
> Name is t2.txt!

      第一个3表示两个文档第3行不同,第二个5c3表示第一个文档有5行,而第2个文档有三行。

      2)[[email protected] Document]# diff -y t1.txt t2.txt        以并排显示比较两个文档的区别

[[email protected] Document]# diff -y t1.txt t2.txt
this is a text!                            this is a text!

Name is t1.txt!                              |    Name is t2.txt!
The extra content!                          <
I am MenAngel!                              <

      3)[[email protected] Document]# diff -y -W 40 t1.txt t2.txt    在(2)的基础上自定义显示的宽度

[[email protected] Document]# diff -y -W 40 t1.txt t2.txt
this is a text!        this is a text!

Name is t1.txt!       |    Name is t2.txt!
The extra conten   <
I am MenAngel!     <

      4)[[email protected] Document]# diff -y -W 40 t1.txt t2.txt 或者 t2.txt t1.txt    文档顺序对结果的影响

[[email protected] Document]# diff -y -W 40 t1.txt t2.txt
this is a text!        this is a text!

Name is t1.txt!       |    Name is t2.txt!
The extra conten   <
I am MenAngel!       <
[[email protected] Document]# diff -y -W 40 t2.txt t1.txt
this is a text!        this is a text!

Name is t2.txt!       |    Name is t1.txt!
           >    The extra conten
           >    I am MenAngel!

  说明:

  “|”表示前后2个文件内容有不同

  “<”表示后面文件比前面文件少了1行内容

  “>”表示后面文件比前面文件多了1行内容

      5)[[email protected] Document]# diff -c t1.txt t2.txt            将进行比较的两个文档的内容全部显示出来标明行数,标出不同点

[[email protected] Document]# diff -c t1.txt t2.txt
*** t1.txt    2016-05-27 23:31:25.949100752 -0700
--- t2.txt    2016-05-27 23:31:54.287100555 -0700
***************
*** 1,5 ****           //从1到5行
  this is a text!
  
! Name is t1.txt!     //第3.4.5行不同
! The extra content!  //由于t2.txt没有第4和第5行,所以第4和第5行表明是比t2.txt多的
! I am MenAngel!
--- 1,3 ----          //从1到3行
  this is a text!
  
! Name is t2.txt!     //第三行不同 

  说明:

  这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:

    (“+” 比较的文件的后者比前着多一行

    “-” 比较的文件的后者比前着少一行)  //-u参数用的

    “!” 比较的文件两者有差别的行

      6)[[email protected] Document]# diff -u t1.txt t2.txt        以合并的方式显示文本的不同      

[[email protected] Document]# diff -u t1.txt t2.txt                        //它的第一部分,也是文件的基本信息
--- t1.txt    2016-05-27 23:31:25.949100752 -0700                       //-号表示第一个文件
+++ t2.txt    2016-05-27 23:31:54.287100555 -0700                       //+号表示第二个文件
@@ -1,5 +1,3 @@
 this is a text!
 
-Name is t1.txt!
-The extra content!
-I am MenAngel!
+Name is t2.txt!                                                  //每个减号对应一个加号,如果没有对应则表明在另一个文件中没有此行

      7)[[email protected] Document]# diff dir1 dir2            比较两个目录

[[email protected] Document]# mkdir dir1 dir2                                 //创建两个目录
[[email protected] Document]# cd dir1
[[email protected] dir1]# cat >text1 <<EOF                                    //在dir1中创建text1,text2在dir2中创建text1,text3
> dir:      dir1
> name:     text1
> 
> Total 4!
> EOF
[[email protected] dir1]# cat >text2 <<EOF
> I am MenAngel!
> I am studying the order of Linux!
> EOF
[[email protected] dir1]# cd ../dir2
[[email protected] dir2]# cat >text1 <<EOF
> dir:      dir2
> name:     text1
> 
> 
> Total 5!
> EOF
[[email protected] dir2]# cat >text3 <<EOF
> Working hard makes success!
> I am MenAngel!
> EOF
[[email protected] dir2]# cd ../
[[email protected] Document]# diff dir1 dir2
只在 dir2 存在:text3
diff dir1/text1 dir2/text1       //遇到同名文件自动比较
1c1
< dir:      dir1
---
> dir:      dir2
4c4,5
< Total 4!
---
> 
> Total 5!
只在 dir1 存在:text2

      8)[[email protected] Document]# diff dir1 dir2 >dir.log      产生补丁,其实就是把原本要输出到标准输出的内容输出到自定义文件中

[[email protected] Document]# diff dir1 dir2 >dir.log
[[email protected] Document]# cat dir.log
只在 dir2 存在:text
diff dir1/text1 dir2/text1
1c1
< dir:      dir1
---
> dir:      dir2
4c4,5
< Total 4!
---
> 
> Total 5!
只在 dir1 存在:text2

      9)[[email protected] Document]# diff t1.txt t2.txt>t12.log        产生补丁,并用此补丁更新文件

[[email protected] Document]# cat t1.txt t2.txt
this is a text!

Name is t1.txt!
The extra content!
I am MenAngel!      //到这是t1.txt的内容
this is a text!

Name is t2.txt!    //到这是t2.txt的内容
[[email protected] Document]# diff t1.txt t2.txt>t12.log       //产生补丁
[[email protected] Document]# patch t1.txt t12.log             //给t1.txt打补丁,让它的内容变为t2.txt的内容
patching file t1.txt
[[email protected] Document]# cat t1.txt
this is a text!

Name is t2.txt!
[[email protected] Document]# patch t2.txt t12.log             //给t2.txt打补丁,不过好像有点差别
patching file t2.txt
Reversed (or previously applied) patch detected!  Assume -R? [n] y    //还不知道是为什么?
[[email protected] Document]# cat t2.txt
this is a text!

Name is t1.txt!
The extra content!
I am MenAngel!

 

    (5)其他:

      扩展知识:

      diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。

以上是关于每天一个Linux命令(31)diff命令的主要内容,如果未能解决你的问题,请参考以下文章

linux 的diff 命令

每天一个linux命令31)--chown命令

Linux 150命令之查看文件及内容处理命令 more split file diff paste wc dps2unix

Linux - Shell - diff

Linux使用diff命令怎么比较文件

linux diff命令