Linux中有兩個比較命令,它們分別是comm
和diff
,在比較文字檔案的版本時通常很有用。本文介紹它們的區別和簡單用法。
該命令對兩個文字檔案進行比較,並顯示每個檔案獨有的行和它們共有的行。
假設我們有兩個檔案:
當我們執行comm file1.txt file2.txt
時,我們會得到:
在我看來,comm
的輸出有些難看,但它是三列。請原諒我糟糕的線條:
第一列包含第一個檔案引數特有的行,第二列包含第二個檔案引數特有的行,第三列包含兩個檔案共有的行。
我們可以通過使用選項-n
,來選擇隱藏指定的列,其中n
可以是1、2或3。假設我們只想輸出兩個檔案共有的行,我們可以使用comm -12 file1.txt file2.txt
。
diff
是一個更加複雜的工具。它支援多種輸出格式,並有能力一次處理大量的文字檔案集。diff
經常被用來建立diff
檔案(修補程式),這些檔案被path
等程式用來將一個或多個檔案的一個版本轉換成另一個版本。讓我們在之前的兩個檔案上執行diff
:diff 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
。