Linux|服务器运维|diff和vimdiff命令详解

前言:

diff命令是一个比较基本的文本文件内容比较工具,主要应用场景是新旧软件更新升级的时候,新旧配置文件的对比;部分语言开发的源码文件差异对比;生成补丁文件,快速同步两个不同的文件

vimdiff命令是一个更直观的文本内容比较工具,比diff命令更为直观,并且这两个命令都可以比较目录

当然,对于二进制文件,比如,有怀疑某个二进制文件被木马病毒等等改变了,如果你有一个确定是正确版本的文件,两者对比的时候,diff命令也会提示是否有差异,只是不显示具体有哪些差异了而已,因此,如果是二进制文件,并且想确切知道两者差异,应该是使用cmp命令了,本文对cmp命令就不做过多介绍了。

ok,下面就diff命令和vimdiff命令如何使用进行演示。

一、diff命令的两种输出形式

1、diff命令的一般输出

diff命令任何参数不加,就只会生成两个文件的差异报告,内容非常少,但不易阅读

例如,现在有这么两个文件,内容如下:

bash 复制代码
[root@centos14 ~]# cat test
11
22

33
44
55

66
77
[root@centos14 ~]# cat test1
11
22
aa
33
44
55
bb
66

如果不加任何参数,diff 文件1 文件2 这样的对比,那么,输出如下:

bash 复制代码
[root@centos14 ~]# diff test test1
3c3
< 
---
> aa
7c7
< 
---
> bb
9d8
< 77

这里的输出是test文件如何改变才能变成和test1文件一样,3c3表示test文件的第三行需要改变;7c7和3c3是一样的;9d8表示在test文件内删除第九行,内容为77;要把 test变成 test1,需要将 test第3行的空行换成 aa,将第7行的空行换成 bb,并删除第9行的 77

2、diff命令的并列显示

bash 复制代码
[root@centos14 ~]# diff -bBwy -W 100 test test1
11						11
22						22
					      |	aa
33						33
44						44
55						55
					      |	bb
66						66
77					      <

参数意义如下:

选 项 功 能
-行数 指定要显示多少行的文本。此参数必须与 -c 或 -u 参数一并使用
-a diff 只会逐行比较文本文件
-b 不检查空格字符的不同
-B 不检查空白行
-c 显示全部内文,并标出不同之处
-c 行数 与执行"-c-行数"指令相同
-d 使用不同的演算法,以较小的单位来做比较
-D 此参数的输出格式可用于前置处理器巨集
-e 此参数的输出格式可用于 ed 的 script 文件
-f 输出的格式类似 ed 的 script 文件,但按照原来文件的顺序来显示不同处
-H 比较大文件时,可加快速度
-I 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异
-i 不检查大小写的不同
-l 将结果交由 pr 程序来分页
-n 将比较结果以 RCS 的格式来显示
-N 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in目录:文件 A 若使用 -N 参 数,则 diff 会将文件 A 与一个空白的文件比较
-p 若比较的文件为 C 语言的程序码文件时,显示差异所在的函数名称
-P 与 -N 类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空 白的文件做比较
-q 仅显示有无差异,不显示详细的信息
-r 比较子目录中的文件
-s 若没有发现任何差异,仍然显示信息
-S 从指定的文件开始比较目录
-t 在输出时,将 tab 字符展开
-T 在每行前面加上 tab 字符以便对齐
-u 以合并的方式来显示文件内容的不同
-v 显示版本信息
-w 忽略全部的空格字符
-W 在使用 -y 参数时,指定栏宽
-x 不比较选项中所指定的文件或目录
-X 可以将文件或目录类型存成文本文件,然后在?中指定此文本文件
-y 以并列的方式显示文件的异同之处
--help 显示帮助
--left-column 在使用 -y 参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容

这种并列对比方式是最为直观的一种方式。简单说,就是标记有< > | 这样的行是两个文件差异的地方,记录的是左边文件如何变化成右边的文件

第二种并列是patch补丁形式,还是以上面两个文件为示例,diff命令只使用-u参数,如果重定向,输出的文件就是补丁文件:

bash 复制代码
[root@centos14 ~]# diff -u test test1
--- test	2026-01-02 16:13:17.338792178 +0800
+++ test1	2026-01-02 12:34:24.484798326 +0800
@@ -1,9 +1,8 @@
 11
 22
-
+aa
 33
 44
 55
-
+bb
 66
-77

如果是以补丁文件的形式,批量修改文本文件,那么,需要使用-U参数,-U后接上下文行数,-u参数是默认的5行上下文,例如以用户文件为例:

bash 复制代码
[root@centos14 ~]# diff -ybBw -W 100 /etc/passwd passwd
root:x:0:0:root:/root:/bin/bash			root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin		bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin		daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin		adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
					      >	sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt		halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologi	mail:x:8:12:mail:/var/spool/mail:/sbin/nologi
operator:x:11:0:operator:/root:/sbin/nologin	operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin	games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin		nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Man	systemd-network:x:192:192:systemd Network Man
dbus:x:81:81:System message bus:/:/sbin/nolog	dbus:x:81:81:System message bus:/:/sbin/nolog
polkitd:x:999:998:User for polkitd:/:/sbin/no	polkitd:x:999:998:User for polkitd:/:/sbin/no
sshd:x:74:74:Privilege-separated SSH:/var/emp	sshd:x:74:74:Privilege-separated SSH:/var/emp
postfix:x:89:89::/var/spool/postfix:/sbin/nol	postfix:x:89:89::/var/spool/postfix:/sbin/nol
					      |	ntp:x:38:38::/etc/ntp:/sbin/nologin
					      <
[root@centos14 ~]# diff -U3 /etc/passwd passwd
--- /etc/passwd	2026-01-02 13:01:21.241256072 +0800
+++ passwd	2026-01-02 18:20:58.335538341 +0800
@@ -3,6 +3,7 @@
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 adm:x:3:4:adm:/var/adm:/sbin/nologin
 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+sync:x:5:0:sync:/sbin:/bin/sync
 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 halt:x:7:0:halt:/sbin:/sbin/halt
 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
@@ -15,5 +16,4 @@
 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
-
-
+ntp:x:38:38::/etc/ntp:/sbin/nologin

以上是说右边的passwd文件比/etc/passwd 文件多sync和ntp两行,上下文是三行

二、补丁patch和diff命令结合应用的场景

还是以上面test和test1这两个文本文件为例,首先,利用diff命令生成补丁文件,然后,通过补丁文件将test文件修改为test1文件的内容:

bash 复制代码
[root@centos14 ~]# cat test
11
22

33
44
55

66
77
[root@centos14 ~]# cat test1
11
22
aa
33
44
55
bb
66
[root@centos14 ~]# diff -u test test1>twofile.patch
[root@centos14 ~]# patch test <twofile.patch 
patching file test
[root@centos14 ~]# cat test
11
22
aa
33
44
55
bb
66

替换完毕后,只要补丁文件还在,就可以随时恢复 patch -R 就可以恢复原来的test文件:

bash 复制代码
[root@centos14 ~]# patch -R test <twofile.patch 
patching file test
[root@centos14 ~]# cat test
11
22

33
44
55

66
77

三、

diff命令结合patch命令的应用场景

一般应用场景是操作系统的迭代更新和配置文件的批量全自动更新

无论是代码版本的迭代,系统配置的批量更新,还是安全漏洞的紧急修复,补丁文件都提供了一种轻量级、高可用的解决方案。掌握补丁技术,是进阶开发者和系统管理员的必备技能。

一般最常用的形式是

  1. diff -urN software-1.0 software-1.0-debian > debian/patches/01-custom-fix.patch (u是标准输出,r是递归,N选项将不存在的文件视为空文件进行比较,确保如果 new_dir中有全新文件,补丁文件会包含创建该文件所需的全部内容,反之亦然。这使得补丁功能更完整。)
  2. patch -p0 -b /etc/ssh/sshd_config < disable_password_auth.patch (-p0命令会直接寻找绝对路径;-p1命令会直接寻找相对路径;应用补丁文件前先备份,备份名称为原文件名.orig)

四、

vimdiff的简单使用

vimdiff是一个比diff -y 更为直观的命令,例如:

启动后,窗口会垂直分割,每个文件在一个窗格中打开。不同的行会高亮显示,通常:

  • 白色背景:相同的内容。

  • 深色背景(如蓝色/绿色):有差异的行。

  • 红色背景:冲突或特别需要关注的行。

另外多说一句,vimdiff也可以当成vim使用,也就是vimdiff和vim是基本一样的,vimdiff 切换窗口是CTRL+w ,hjkl

相关推荐
Program Debug2 小时前
Mac安装JDK
java·开发语言·macos
HIT_Weston2 小时前
83、【Ubuntu】【Hugo】搭建私人博客:文章目录(二)
linux·运维·ubuntu
ICT系统集成阿祥2 小时前
XXXX银行培训干校无线AP故障排查优化案例
运维·网络
.普通人2 小时前
树莓派4Linux 单个gpio口驱动编写
linux
玄同7653 小时前
我是如何学习编程的?——从 “扳手使用” 到编程学习:踩坑式实践的底层方法论
开发语言·人工智能·经验分享·笔记·python·学习·自然语言处理
xingzhemengyou13 小时前
Python lambda函数
开发语言·python
Geoking.3 小时前
【Java】深入理解 Java 枚举(Enum)
java·开发语言
专业开发者3 小时前
蓝牙 ® 助听器已迈入成熟应用阶段
网络·物联网
老王熬夜敲代码3 小时前
C++新特性:string_view
开发语言·c++·笔记