9

Linux系列之比较命令 - chuckQu

 2 years ago
source link: https://www.cnblogs.com/chuckQu/p/16540952.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Linux中有两个比较命令,它们分别是commdiff,在比较文本文件的版本时通常很有用。本文介绍它们的区别和简单用法。

comm命令

该命令对两个文本文件进行比较,并显示每个文件独有的行和它们共有的行。

假设我们有两个文件:

image.png

当我们运行comm file1.txt file2.txt时,我们会得到:

image.png

在我看来,comm的输出有些难看,但它是三列。请原谅我糟糕的线条:

image.png

第一列包含第一个文件参数特有的行,第二列包含第二个文件参数特有的行,第三列包含两个文件共有的行。

我们可以通过使用选项-n,来选择隐藏指定的列,其中n可以是1、2或3。假设我们只想输出两个文件共有的行,我们可以使用comm -12 file1.txt file2.txt

image.png

diff命令

diff是一个更加复杂的工具。它支持多种输出格式,并有能力一次处理大量的文本文件集。diff经常被用来创建diff文件(补丁),这些文件被path等程序用来将一个或多个文件的一个版本转换成另一个版本。让我们在之前的两个文件上运行diffdiff file1.txt file2.txt

image.png

这是默认的输出样式。在该格式中,每组变化之前都有一个变化命令,以range operation range的形式描述将第一个文件转换为第二个文件所需的位置和变化类型。

首先来看:

1d0
< a

这告诉我们必须删除file1的第一行,也就是带a的那一行。

接下来看:

4a4
> e

这告诉我们,我们必须在第一个文件里添加一行,在第四行的位置。然后告诉我们在哪一行添加> e

我知道这是令人困惑的,坦白说,默认样式没有使用太多的上下文格式和统一格式,让我们看看那些解释更多。让我们来看看这些,并作进一步解释。

我们可以通过添加-c选项来使用上下文格式:

diff -c file1.txt file2.txt
image.png

在顶部我们可以看到,两个文件的名称以及时间戳,第一个文件使用星号标记,第二个文件使用破折号标记。diff将使用星号或破折号来让我们知道,它在整个列表的其余部分谈论的是哪个文件。

接下来我们会看到一行星号,这仅仅是为了格式化。

然后我们得到一系列的变化,在第一组变化中,我们可以看到:

*** 1,4 ****

这意味着第一个文件中的第1行到第4行。

然后可以看到:

- a
  b
  c
  d

这就是文件的内容。只不过在a前面有个-,这意味着我们要删除它。

标志 含义
blank 不需要任何改变
(-) 需要删除行
(+) 需要添加行
! 需要改变行

在第一组变化中,我们可以看到带有-a的行需要从第一个文件中删除。第二组变化为:

--- 1,4 ----
  b
  c
  d
+ e

---1,4----是第二个文件的范围,+ e意味着我们需要添加该行到第一个文件中,记住我们的目标是让第一个文件匹配第二个文件。

我们也可以使用统一格式,它与格式上下文类似,但是更简洁。它消除了上下文的重复行。diff -u file1.txt file2.txt

image.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK