Unix:享受diff的乐趣

当您在Unix系统上疑难解答问题时,diff命令可能是您最好的朋友,但是您是否能够有效地使用它呢?

Unix diff命令非常方便,但它能做的不仅仅是让您知道正在计算的两个文件是相同还是不同。它可以找到并展示不同之处它可以通过几种不同的方式找到并展示不同之处。它还可以生成可以强制不同文件相同的文件。让我们看看diff最常见的用法,然后看看它还能做些什么让你的工作更简单。diff命令最常见的用法之一是告诉用户两个文件(根据大小和其他特征,如权限、所有权和名称)是否实际上相同,这两个文件看起来可能相同。diff命令可以执行lickety-split(19世纪的意思是“非常快”)逐字节比较,即使文件非常大。

$ diff /usr/bin/time /bin/date二进制文件/usr/bin/time和/bin/date不同

这些文件是不同的。time命令和date命令的可执行文件是不一样的。这并不奇怪,因为命令的功能是如此不同。您不会期望它们共享代码,那么为什么要将它们实现为单个文件呢?如果你在看的文件是内容不同,你看没有diff命令的输出。

/usr/bin/zcmp /usr/bin/zdiff

如果我们注意到这两个文件实际上是硬链接,就像我正在工作的系统上的那样,这个输出应该不会让我们感到惊讶:

/usr/bin/zcmp /usr/bin/zdiff 3257719 /usr/bin/zcmp 3257719

注意,它们有相同的inode编号,因此它们是相同的文件。另一方面,当用于检测和报告文本文件之间的差异时,您可以期望看到更多有趣的结果。如果文件包含完全相同的文本,我们将再次看不到输出,但如果我们使用diff检查两个非常简单但不同的文本文件,我们将看到如下内容:

$ diff one 2 1d0 < 1 3d1 < 3 5d2 < 5 7c4,6 < 7——> 8 > 10 > 12

当然,您可能只需要查看这个文件并得出文件不同的结论,但是这个输出可能更有用。显然,文件是不同的。但是像3d1这样的命令序列到底是什么意思呢?为了更好地理解这里发生了什么,让我们首先看看两个文件(one和two)的内容。它们看起来是这样的:

一二=== ===一二二四三六四八五十六十二七

现在回头看看diff输出。在每个命令字符串(如3d1)中,字母前面的部分(如3)是行号或行的范围。“3”表示“第3行”。如果它是“3,5”,则意味着第3行到第5行。

$ diff one two 1d0 < one 3d1

字母代表命令。可以使用a (append)、c (change)、d (delete)、i (insert)和s (substitute)命令来解决两个文件之间的差异。换句话说,命令可以使文件完全相同。字母后面的数字表示第二个文件中的行或行范围。这些命令代表一个脚本,使用补丁命令将文件“1”更改为文件“2”的副本。它将添加缺少的行(文件2中而不是文件1中的行),并删除多余的行(文件1中而不是文件2中的行)。虽然这似乎不是一件令人兴奋的事情,但想象一下,如果能够使用一组ed命令在配置文件中复制更改,则只允许捕获和复制更改,而不产生任何其他影响。

$ cat one1 $ cat one1 $ cat one1 $ cat one1 $ cat one1 $ cat one1

文件one1现在使用更改命令进行了更新,使其看起来像两个文件。在现实世界中,您可能要更改十几行,然后在一个几百行长的文件中添加4行。你可能会在几百个系统上这样做。你可以信任某人的“手工编辑”过程,或者你可以发送一个“补丁文件”,甚至一个脚本来运行它。当然,您也可以复制更改后的文件。但是让这些变化尽可能的简单和可调度可能是最好的方法。毕竟,您可能要将修复程序发送给远方的客户或员工。

$ cat runme patch 1 -i fixit -o one1 mv one1 1

你也可以使用-e选项将diff的输出保存为ed格式,如下所示:

$ diff -e fix one two

在这种情况下,修复文件看起来像这样:

$ cat fixit 7c 8ten 12。5 d 3 d 1 d

如果需要,可以在ed中打开要更改的文件,键入命令7c、8等等,就可以进行更改了。然后用w (write)命令退出ed,用q命令退出。要从命令行运行更改,你需要做如下操作:

$ (cat fixit && echo w) | Ed - 1 $ cat 1 2 4 6 8 10 12

带括号的命令被发送到ed, ed使用“fixit”文件进行更改。文件的显示显示已经进行了更改。使用diff命令的另一种有用方法是使用-p选项。有了这个选项,两个文件之间的区别就会以一种为查看器提供更多上下文的方式来说明。正如您将在下面注意到的,我们首先得到一些关于文件更新时间的信息。然后我们看到两个文件的内容,其中file中的行出现在一个文件中,但在另一个文件中缺少-

$ diff -p one two *** one 2014-06-28 17:04:05.000000000 -0400——two 2014-06-28 15:31:33 000000000 -0400 *************** *** 1,7 **** - 1 2 - 3 4- 5 6 !七——1,6 ----二四六!八!十个!十二个

您可能更喜欢-y选项,因为它将以并行方式显示两个文件之间的差异。

$ diff -y 1 2 1 < 2 2 3 < 4 4 5 < 6 6 > 8

如果您希望用两种颜色中的一种来显示不同的行来指示源文件,您也可以安装并使用colordiff命令(例如,一个文件中的行可能是红色的,另一个文件中的行可能是蓝色的)。如果要比较的文件在两个不同的系统上,确定它们是否相同的更好方法是计算校验和并比较校验和。md5sum命令非常适合此操作。

Server1 $ md5sum file1 0789d2dcc23a7984a47319228597c1c4
Server2 > md5sum file1 95ee44328db4819563548fd9789becb2 file1

像-i忽略大小写差异,-ignore-all-space和- ignore-blank lines这样的选项也可以在你不想被无关紧要的文件差异所困扰的时候派上用场。diff命令有超过60个选项——这表明它比你所期望的要复杂和多功能性得多。

阅读更多的雷竞技投注下载桑德拉·亨利-斯托克的Unix第二语言博客并关注最新的这新闻ITworld,推特脸谱网

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对自己最关心的话题发表评论。

版权所有©2014 IDG ComRaybet2munications, Inc.

SD-WAN买家指南:向供应商(和您自己)提出的关键问题