Linux 中的 diff 命令及示例
diff 代表差异。该命令用于通过逐行比较文件来显示文件中的差异。与其他成员 cmp 和 comm 不同,它告诉我们要更改一个文件中的哪些行以使两个文件相同。
要记住的重要一点是diff使用某些特殊符号和指令,这些符号和指令使两个文件相同。它告诉您有关如何更改第一个文件以使其与第二个文件匹配的说明。
特殊符号有:
a : add
c : change
d : delete
句法 :
diff [options] File1 File2
假设我们有两个名为a.txt和b.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命令的输出,即上下文模式和统一模式。
- -c(上下文):要查看上下文模式的差异,请使用-c选项。让我们尝试通过示例来理解这一点,我们有两个文件file1.txt和file2.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) – :表示需要删除第一个文件中的一行,使它们相同。
就像在我们的例子中一样,需要从第一个文件中删除 mv和comm并将 diff和comm添加到第一个文件中以使它们相同。之后是三个破折号——后面是第二个文件的行范围(在我们的例子中是第 1 行到第 4 行,用逗号分隔)。然后是四个破折号---- 。然后它显示第二个文件的内容。
- -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相同。 - -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
- –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
电脑希望