Linux系列之比較命令

前言

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