本文原创首发于公众号:编程三分钟
今天学了三个文本比较的命令分享给大家。
comm
comm 命令比较相同的文本
$ cat char
a
b
c
$ cat chardiff
a
d
c
比如,我有两个文件char
和chardiff
如上,略有不同,就可以用这个命令输出。
$ 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
命令比较笨,只能针对已经排序过的数据,如果没有排序过,像abc
和acb
就会识别成仅仅a
相同,暂时没想到比较好的使用场景。
diff
用到git
的都知道git diff
有多好用,虽然不如可视化页面直观,意在快速便捷。下面是一个例子,char
文件内容是abc
,chardiff2
内容是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
:取消打过的补丁