Linux系列之比較命令

2022-08-01 18:08:18

前言

Linux中有兩個比較命令,它們分別是commdiff,在比較文字檔案的版本時通常很有用。本文介紹它們的區別和簡單用法。

comm命令

該命令對兩個文字檔案進行比較,並顯示每個檔案獨有的行和它們共有的行。

假設我們有兩個檔案:

當我們執行comm file1.txt file2.txt時,我們會得到:

在我看來,comm的輸出有些難看,但它是三列。請原諒我糟糕的線條:

第一列包含第一個檔案引數特有的行,第二列包含第二個檔案引數特有的行,第三列包含兩個檔案共有的行。

我們可以通過使用選項-n,來選擇隱藏指定的列,其中n可以是1、2或3。假設我們只想輸出兩個檔案共有的行,我們可以使用comm -12 file1.txt file2.txt

diff命令

diff是一個更加複雜的工具。它支援多種輸出格式,並有能力一次處理大量的文字檔案集。diff經常被用來建立diff檔案(修補程式),這些檔案被path等程式用來將一個或多個檔案的一個版本轉換成另一個版本。讓我們在之前的兩個檔案上執行diffdiff file1.txt file2.txt

這是預設的輸出樣式。在該格式中,每組變化之前都有一個變化命令,以range operation range的形式描述將第一個檔案轉換為第二個檔案所需的位置和變化型別。

首先來看:

1d0
< a

這告訴我們必須刪除file1的第一行,也就是帶a的那一行。

接下來看:

4a4
> e

這告訴我們,我們必須在第一個檔案裡新增一行,在第四行的位置。然後告訴我們在哪一行新增> e

我知道這是令人困惑的,坦白說,預設樣式沒有使用太多的上下文格式和統一格式,讓我們看看那些解釋更多。讓我們來看看這些,並作進一步解釋。

我們可以通過新增-c選項來使用上下文格式:

diff -c file1.txt file2.txt

在頂部我們可以看到,兩個檔案的名稱以及時間戳,第一個檔案使用星號標記,第二個檔案使用破折號標記。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