linux 命令-文本比較comm、diff、patch

  • 2019 年 12 月 12 日
  • 筆記

今天學了三個文本比較的命令分享給大家。——編程三分鐘

comm

comm 命令比較相同的文本

$ cat char  a  b  c  $ cat chardiff  a  d  c

比如,我有兩個文件charchardiff如上,略有不同,就可以用這個命令輸出。

$ comm char chardiff          a  b  c      d      c

如上,看起來輸出的亂七八糟,他只是把兩個文件按列把各自特有的輸出,最後再輸出共有的。

所以參數-1代表不輸出第1列,也就是第2列和第3列。-2輸出第1列和第3列,-3輸出第1、2列的。參數比較廢,看起來很費勁。

$ comm -1 char chardiff      a  d  c  $ comm -12 char chardiff  a

comm命令比較笨,只能針對已經排序過的數據,如果沒有排序過,像abcacb就會識別成僅僅a相同,暫時沒想到比較好的使用場景。

diff

用到git的都知道git diff有多好用,雖然不如可視化頁面直觀,意在快速便捷。

下面是一個例子,char文件內容是abcchardiff2內容是bcd

$ diff -c char chardiff2  *** char    2019-09-16 21:40:47.000000000 +0800  --- chardiff2    2019-09-17 00:38:52.000000000 +0800  ***************  *** 1,3 ****  - a    b    c  --- 1,3 ----    b    c  + d

直接加了-c參數是為了更直觀,感興趣可以自己嘗試去掉-c看看是什麼效果。

*** 1,3 ****--- 1,3 ----代表1到3行,-代表刪除行,+代表增加行,!代表更改行。

diff不僅可以臨時對比兩個文件之間的差異,但是和下一個命令組合起來才是其真正的用處。

patch 修補程式

通常在更新幾百萬行的項目時,如果只有幾行有變化,全部打包過來根本是不可能的,因為它太大了,而且全部拷過來也沒有意義,最大的問題是人力難以對比。

在這之前我們需要生成一個修補程式文件

$ diff -Naur folder1 folder2 > diff_file  $ ls folder1  char chardiff  $ ls folder2  char chardiff ip

得到修補程式文件diff_file之後,發到與foler1版本一模一樣的位置就可以更新成功了!

$ cd folder1  $ patch < diff_file  $ patch < diff_file  patching file chardiff  patching file ip

如果要回滾就加-R參數

$ patch -R < diff_file  patching file chardiff  patching file ip

它的參數如下 -p num :忽略幾層文件夾 -E :如果發現了空文件,那麼就刪除它 -R :取消打過的修補程式