极客进化岛
技术自由路

[linux]循序渐进学运维-基础命令篇-diff

文章目录**
diff的基本语法及参数

  1. 比较两个文件
  2. 并排格式输出
  3. -u 以合并文件的方式显示不同
    补充: 三个文本比较命令:
    comm: 比较相同的文本,特点是: 如果文本中有空格就无法识别
    patch 补丁:
    举例:
    后记

diff的基本语法及参数

diff的用法,diff后面直接加选项,主要用来逐行对比文件
参数:

  • -<行数>  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
  • -a或--text  diff预设只会逐行比较文本文件。
  • -b或--ignore-space-change  不检查空格字符的不同。
  • -B或--ignore-blank-lines  不检查空白行
  • -c  显示全部内文,并标出不同之处。
  • -H或--speed-large-files  比较大文件时,可加快速度。
  • -i或--ignore-case  不检查大小写的不同。
  • -u,-U<列数>或--unified=<列数>  以合并的方式来显示文件内容的不同。
  • -v或--version  显示版本信息。
  • -w或--ignore-all-space  忽略全部的空格字符。
  • --help  显示帮助。

举例子:

1. 比较两个文件

[root@zmkjedu71 ~]# touch passwd passwd1
[root@zmkjedu71 ~]# vim passwd
2a3
[root@zmkjedu71 ~]# vim passwd1
2a4
[root@zmkjedu71 ~]# diff passwd passwd1
1c1
< 2a3
---
> 2a4
[root@zmkjedu71 ~]#

在这里插入图片描述

[root@zmkjedu71 ~]# diff passwd passwd1 -y -W 10
2a  |   2a
[root@zmkjedu71 ~]#
[root@zmkjedu71 ~]# diff passwd passwd1 -y -W 20
2a3   | 2a4
[root@zmkjedu71 ~]# 
[root@zmkjedu71 ~]# diff passwd passwd1 -y -W 30
2a3       | 2a4
[root@zmkjedu71 ~]# 

在这里插入图片描述 注: 这里的 -y表示并排显示 -W 指定行宽

3. -u 以合并文件的方式显示不同

[root@zmkjedu71 ~]# diff -u passwd passwd1
--- passwd  2022-06-11 13:07:33.715996921 +0800
+++ passwd1 2022-06-11 13:07:49.057997388 +0800
@@ -1 +1 @@
-2a3
+2a4
[root@zmkjedu71 ~]#

注:
—开头的是原始文件

+++开头的是目标文件

以-开头的是只出现在原始文件中的

以+开头的是只出现在目标文件中的

以空格 开始的行是在目标文件和原始文件中都出现的行

补充: 三个文本比较命令:

comm , diff, patch

comm: 比较相同的文本,特点是: 如果文本中有空格就无法识别

[root@zmkjedu71 ~]# vim a.txt 
aaa
   bbb
[root@zmkjedu71 ~]# vim b.txt
aaa
bbb
[root@zmkjedu71 ~]# cat a.txt 
aaa
   bbb
[root@zmkjedu71 ~]# cat b.txt 
aaa
bbb
[root@zmkjedu71 ~]# comm a.txt b.txt 
        aaa
    bbb
   bbb
[root@zmkjedu71 ~]# 

其实bbb是相同的,只是一个有空格,一个没有空格,会被当成不同来显示。

patch 补丁:

通常在更新几百万行的项目时,如果只有几行有变化,全部打包过来根本是不可能的,因为它太大了,而且全部拷过来也没有意义,最大的问题是人力难以对比。 这个时候我们可以用到patch

patch主要用于修补文件

举例:

创建两个文件

[root@zmkjedu71 ~]# vim a.txt
11111
11111
11111
11111
[root@zmkjedu71 ~]# vim b.txt
22222
11111
22222
11111
[root@zmkjedu71 ~]# cat a.txt 
11111
11111
11111
11111
[root@zmkjedu71 ~]# cat b.txt 
22222
11111
22222
11111

使用diff 创建补丁 b.txt.patch

[root@zmkjedu71 ~]# diff -uN a.txt b.txt > b.txt.patch
[root@zmkjedu71 ~]# cat b.txt.patch 
--- a.txt   2022-06-11 14:20:40.115992873 +0800
+++ b.txt   2022-06-11 14:21:03.679992871 +0800
@@ -1,4 +1,4 @@
+22222
 11111
-11111
-11111
+22222
 11111
[root@zmkjedu71 ~]#

备注:
补丁头是分别由—/+++开头的两行,用来表示要打补丁的文件。—开头表示旧文件,+++开头表示新文件。
*diff命令会在补丁文件中记录这两个文件的首次创建时间,如下
— a.txt 2020-06-19 20:54:54.115330192 +0800
+++ b.txt 2020-06-19 20:55:34.924697772 +0800

接下来开始打补丁:

[root@zmkjedu71 ~]# patch -p0 < b.txt.patch
patching file a.txt
[root@zmkjedu71 ~]# cat a.txt
22222
11111
22222
11111
[root@zmkjedu71 ~]#

可以看到a.txt变得和b.txt一样了

我们也可以去除补丁

[root@zmkjedu71 ~]# patch -RE -p0 < b.txt.patch
patching file a.txt
[root@zmkjedu71 ~]# cat a.txt
11111
11111
11111
11111
[root@zmkjedu71 ~]#

可以看到又恢复到了原版本的a.txt

后记

学习Linux基础命令,最好的方法就是根据一个命令去联想类似的命令的使用方法,你会发现很多参数,虽然命令不同,但表示的意思基本相同。

赞(0)
未经允许不得转载:极客进化岛 » [linux]循序渐进学运维-基础命令篇-diff