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

相关推荐
大哥您好几秒前
QEMU 11.1.2 多架构编译指南(x86_64 / aarch64 / riscv64)
linux·服务器
狗凯之家源码网14 分钟前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE438 分钟前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience1 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
道满科技1 小时前
Function Calling 参数总出错?只修参数就行
linux·windows·python
Gauss松鼠会1 小时前
高斯数据库(openGauss)的物理存储结构
运维·服务器·数据库·sql·opengauss·经验总结
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_prepare_read调用流程与实战(七十四)
linux·运维·服务器·gstreamer音视频·音视频进阶
栈帧之外2 小时前
【C++】STL之set
开发语言·c++
杨云龙UP2 小时前
PostgreSQL 18.4 数据库整库迁移实战:pg_dump 备份与 pg_restore 恢复完整操作手册
运维·服务器·数据库·postgresql·pg_dump·pg_restore
我科绝伦(Huanhuan Zhou)2 小时前
Linux 通用压力测试脚本合集:磁盘 + 网络
linux·网络·压力测试