Linux系列之比較命令
- 2022 年 8 月 1 日
- 筆記
前言
Linux中有兩個比較命令,它們分別是comm
和diff
,在比較文本文件的版本時通常很有用。本文介紹它們的區別和簡單用法。
comm命令
該命令對兩個文本文件進行比較,並顯示每個文件獨有的行和它們共有的行。
假設我們有兩個文件:
當我們運行comm file1.txt file2.txt
時,我們會得到:
在我看來,comm
的輸出有些難看,但它是三列。請原諒我糟糕的線條:
第一列包含第一個文件參數特有的行,第二列包含第二個文件參數特有的行,第三列包含兩個文件共有的行。
我們可以通過使用選項-n
,來選擇隱藏指定的列,其中n
可以是1、2或3。假設我們只想輸出兩個文件共有的行,我們可以使用comm -12 file1.txt file2.txt
。
diff命令
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
。