📜  Linux 中的 diff 命令及示例

📅  最后修改于: 2022-05-13 01:57:29.923000             🧑  作者: Mango

Linux 中的 diff 命令及示例

diff 代表差异。该命令用于通过逐行比较文件来显示文件中的差异。与其他成员 cmp 和 comm 不同,它告诉我们要更改一个文件中的哪些行以使两个文件相同。

要记住的重要一点是diff使用某些特殊符号指令,这些符号和指令使两个文件相同。它告诉您有关如何更改第一个文件以使其与第二个文件匹配的说明。

特殊符号有:

a : add
c : change
d : delete

句法 :

diff [options] File1 File2 

假设我们有两个名为a.txtb.txt 的文件,其中包含 5 个印度州。



$ ls
a.txt  b.txt

$ cat a.txt
Gujarat
Uttar Pradesh
Kolkata
Bihar
Jammu and Kashmir

$ cat b.txt
Tamil Nadu
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh

现在,在没有任何选项的情况下应用 diff命令,我们得到以下输出:

$ diff a.txt b.txt
0a1
> Tamil Nadu
2,3c3
< Uttar Pradesh
 Andhra Pradesh
5c5
 Uttar pradesh

我们来看看这个输出是什么意思。差异输出的第一行将包含:

  • 第一个文件对应的行号,
  • 一个特殊的符号和
  • 对应于第二个文件的行号。

就像在我们的例子中一样, 0a1意味着第 0 行之后(在文件的最开头)你必须添加泰米尔纳德邦以匹配第二个文件的第 1 行。然后它告诉我们每个文件中的这些行是什么,以符号开头:

  • <开头的行是来自第一个文件的行。
  • >前面的行是来自第二个文件的行。
  • 下一行包含2,3c3 ,这意味着需要更改第一个文件中的第 2 行到第 3 行以匹配第二个文件中的第 3 行。然后它告诉我们带有上述符号的那些行。
  • 三个破折号(“—”)只是将文件 1 和文件 2 的行分开。

作为使这两个文件相同的摘要,首先在第一个文件的开头添加泰米尔纳德邦以匹配第二个文件的第 1 行,然后将第一个文件的第 2 行和第 3 行(即北方邦加尔各答)更改为第二个文件的第 3 行,即安得拉邦。之后,将第一个文件的第 5 行(即查谟和克什米尔)更改为第二个文件的第 5 行,即北方邦

现在让我们看看当diff告诉我们需要删除一行时的样子。

$ cat a.txt
Gujarat
Andhra Pradesh
Telangana
Bihar
Uttar pradesh

$ cat b.txt
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh

$ diff a.txt b.txt
3d2
< Telangana

上面的输出3d2表示删除第一个文件的第 3 行,即Telangana,以便两个文件在第 2 行同步。

选项

Linux 系统提供了两种不同的方式来查看diff命令的输出,即上下文模式统一模式

  1. -c(上下文):要查看上下文模式的差异,请使用-c选项。让我们尝试通过示例来理解这一点,我们有两个文件file1.txtfile2.txt
    $ cat file1.txt                                                                                                                            
    cat                                                                                                                                              
    mv                                                                                                                                               
    comm                                                                                                                                             
    cp 
    
    $ cat file2.txt
    cat                                                                                                                                              
    cp                                                                                                                                               
    diff                                                                                                                                             
    comm
                                                                                                       
    $ diff -c file1.txt file2.txt                                                                                                              
    *** file1.txt   Thu Jan 11 08:52:37 2018                                                                                                         
    --- file2.txt   Thu Jan 11 08:53:01 2018                                                                                                         
    ***************                                                                                                                                  
    *** 1,4 ****                                                                                                                                     
      cat                                                                                                                                            
    - mv                                                                                                                                             
    - comm                                                                                                                                           
      cp                                                                                                                                             
    --- 1,4 ----                                                                                                                                     
      cat                                                                                                                                            
      cp                                                                                                                                             
    + diff                                                                                                                                           
    + comm 
    

    第一个文件用***表示,第二个文件用表示。
    带有 ***************的行只是一个分隔符。

    此输出的前两行向我们显示了有关文件 1文件 2 的信息。它列出了我们每个文件的文件名、修改日期和修改时间,每行一个。
    下一行有三个星号***后跟第一个文件的行范围(在我们的例子中是第 1 行到第 4 行,用逗号分隔)。然后四个星号**** 。之后,它会显示第一个文件的内容,并带有以下指示符:

    (i)如果该行需要不变,则以两个空格为前缀。
    (ii)如果需要更改该行,则以符号和空格为前缀。符号含义如下:

    (a) + :它表示第二个文件中需要添加到第一个文件中的一行以使其相同。
    (b) – :表示需要删除第一个文件中的一行,使它们相同。
    就像在我们的例子中一样,需要从第一个文件中删除 mvcomm并将 diffcomm添加到第一个文件中以使它们相同。

    之后是三个破折号——后面是第二个文件的行范围(在我们的例子中是第 1 行到第 4 行,用逗号分隔)。然后是四个破折号---- 。然后它显示第二个文件的内容。

  2. -u(统一):要查看统一模式下的差异,请使用-u选项。它类似于上下文模式,但不显示任何冗余信息或以简洁的形式显示信息。
    $ cat file1.txt                                                                                                                            
    cat                                                                                                                                              
    mv                                                                                                                                               
    comm                                                                                                                                             
    cp 
    
    $ cat file2.txt                                                                                                                            
    cat                                                                                                                                              
    cp                                                                                                                                               
    diff                                                                                                                                             
    comm
    
    $ diff -u file1.txt file2.txt                                                                                                            
    --- file1.txt   2018-01-11 10:39:38.237464052 +0000                                                                                              
    +++ file2.txt   2018-01-11 10:40:00.323423021 +0000                                                                                              
    @@ -1,4 +1,4 @@                                                                                                                                  
     cat                                                                                                                                             
    -mv                                                                                                                                              
    -comm                                                                                                                                            
     cp                                                                                                                                              
    +diff                                                                                                                                            
    +comm
    

    第一个文件用表示,第二个文件用+++表示。
    此输出的前两行向我们显示了有关文件 1文件 2 的信息。它列出了我们每个文件的文件名、修改日期和修改时间,每行一个。
    之后,下一行有两个符号@后跟第一个文件的行范围(在我们的例子中是第 1 行到第 4 行,用逗号分隔)以为前缀,然后是空格,然后再次跟从第二个文件开始的行范围文件以 +为前缀,最后两个在符号@ 处。后跟输出中的文件内容告诉我们哪些行保持不变,哪些行需要在文件 1 中添加或删除(用符号表示)以使其与文件 2相同。

  3. -i:默认情况下,此命令区分大小写。要使此命令不区分大小写,请使用-i选项和diff
    $ cat file1.txt
    dog
    mv
    CP
    comm
    
    $ cat file2.txt
    DOG
    cp
    diff
    comm
    
    Without using this option:
    $ diff file1.txt file2.txt
    1,3c1,3
    < dog
    < mv
     DOG
    > cp
    > diff
    
    Using this option:
    $ diff -i file1.txt file2.txt
    2d1
     diff
    
  4. –version :此选项用于显示当前在系统上运行的 diff 版本。
    $ diff --version
    diff (GNU diffutils) 3.5
    Packaged by Cygwin (3.5-2)
    Copyright (C) 2016 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later .
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Written by Paul Eggert, Mike Haertel, David Hayes,
    Richard Stallman, and Len Tower.
    
    


参考:
Unix 概念和应用程序 – Das, Sumitabha
电脑希望