Diff命令详解

a - add
c - change
d - delete

lar - Add the lines in range r of the second file after line lof
the first file. For example, 8a12,15 means append lines 12-15
of file 2 after line 8 of file 1; or, if changing file 2 into file1,
delete lines 12-15 of file 2.

fct - Change the lines in range f of the first file with linesin
range t of the second file. This is like a combined add and
delete, but more compact. For example, 5,7c8,10 means
change lines 5-7 of file 1 to read as lines 8-10 of file 2; or,if
changing file 2 into file 1, change lines 8-10 of file 2 to readas
lines 5-7 of file 1.

rdl - Delete the lines in range r from the first file; line l iswhere
they would have appeared in the second file had they
not been deleted. For example, 5,7d3 means delete lines 5-7
of file 1; or, if changing file 2 into file 1, append lines 5-7 offile
1 after line 3 of file 2.


Diff命令

 

  该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

 

  语法:diff [选项] file1 file2

 

  说明:该命令告诉用户,为了使两个文件file1和file2一致,需要修改它们的哪些行。如果用“- ”表示file1或fiie2,则表示标准输入。如果file1或file2是目录,那么diff将使用该目录中的同名文件进行比较。

 

  例如: diff /usr/xu mine

 

  把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。

 

  通常输出由下述形式的行组成:

 

  n1 a n3,n4

 

  n1,n2 d n3

 

  n1,n2 c n3,n4 这些行类似ed命令把filel转换成file2。字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)是针对file2的。字母a、d和c分别表示附加、删除和修改操作。

 

  在上述形式的每一行的后面跟随受到影响的若干行,以“<”打头的行属于第一个文件,以“>”打头的行属于第二个文件。

 

  diff能区别块和字符设备文件以及FIFO(管道文件),不会把它们与普通文件进行比较。

 

  如果file1和file2都是目录,则diff会产生很多信息。

 

  如果一个目录中只有一个文件,则产生一条信息,指出该目录路径名和其中的文件名。

 

  diff各选项的含义如下:

 

  - b 忽略行尾的空格,而字符串中的一个或多个空格符都视为相等。

 

  如How are you与How are you被视为相同的字符串。

 

  - c 采用上下文输出格式(提供三行上下文)。

 

  - C n 采用上下文输出格式(提供n行上下文)。

 

  - e 产生一个合法的ed脚本作为输出。

 

  - r 当file1和file2是目录时,递归作用到各文件和目录上。

 

Sample in Unix:

file1 :

      1 class Myclass
      2 {
      3   public:
      4   Myclass(){};
      5   ~Myclass(){};
      6   //
      7   int Gety();
      8   private:
      9   string Getstr();
     10   private:
     11   int a;
     12
     13 };
     14
     15 main( )
     16 {
     17   Myclass myclass;
     18   myclass.Gety();
     19   myclass.Getstr();
     20   
     21   strxy
     22   3344
     23 }
     24  
     25  

file2:

      1 main( )
      2 {
      3   1122
      4   int n , m ;
      5   n= 10 ;
      6   printf ( <93> % d //// n <94> , m = n * 10);
      7   3344
      8   aabb
      9 }

 

 

#diff file1 file2
1,14d0
< class Myclass
< {
<   public:
<   Myclass(){};
<   ~Myclass(){};
<   //
<   int Gety();
<   private:
<   string Getstr();
<   private:
<   int a;
<
< };
<
17,21c3,6
<   Myclass myclass;
<   myclass.Gety();
<   myclass.Getstr();
<   
<   strxy                      
---
>   1122
>   int n , m ;
>   n= 10 ;
>   printf (  % d //// n  , m = n * 10);
22a8
>   aabb
24,25d9
<
<

diff 命令只是将file1 的内容改变为与file2一样,也就是file2的内容不变的基础上,参照file2的内容,如何删除添加或是修改file1的内容,使之与file2一样。最终显示的比较结果也就是显示如何删除添加或是修改file1的内容。


二:diff -u


diff -u tmp1/a.txt tmp2/a.txt
--- tmp1/a.txt    2013-08-27 16:46:49.434894947 +0800
+++ tmp2/a.txt    2013-08-27 16:46:23.150894797 +0800
@@ -1,13 +1,12 @@
-test start
-eagle
-pigeon
 1qjllsjsd
 love
 love
 lslslslsls
+111122
+skdslfldsl
 end now
 slslsll
 1111111111111111111111111
 2222222222222
+3333333333333333
 666666666666666666
-test end

比较结果分为三部分:
1>基本信息
diff结果的开始三行是diff结果的基本信息,包括diff命令,比较的文件和文件的创建时间。文件名前的"---"表示变动前的文件,"+++"表示变动后的文件。
2>变动的位置
用两个@作为起首和结束,@@ -1,13 +1,12 @@,前面的"-1,13"含义,减号表示第一个文件(即tmp1/a.txt),"1"表示从第1行开始,"13"表示连续的13行,表示下面显示的比较结果是第一个文件从第1行开始的连续13行。"+1,12"的含义,第一个文件的第1到13行变动后,对应变成第二个文件从第1行到12行。变动的位置信息即表示,第一个文件的从哪一行开始的多少行改动后就变成了第二个文件的哪一行开始的多少行。
3>文件变动的内容
带减号的是第一个文件里的(表示变动时要从第一个文件中删除);带加号的表示变动时要从第二个文件里加到第一个文件里的;没有加减号的,表示第一个和第二个文件里这部分内容相同。带减号的加上不带符号的就是第一个文件里要变动的总共内容,即-1,13;带加号的加上不带符号的就是第二个文件的内容,即+1,12。


你可能感兴趣的:(Linux)