linxu命令diff:比较两个或多个文件的内容差异的工具diff详解

ops/2024/9/18 12:04:30/ 标签: 文件, 目录, 比较工具, linux, centos, Ubuntu

目录

一、概述

二、用法

1、基本语法        

2、基本用法

3、常用选项

4、获取帮助

三、输出格式

1、正常格式(normal diff)

2、上下文格式(context diff)

3、合并格式(unified diff)

四、示例

1、比较两个文本文件

(1)命令

(2)实际结果

(3)输出解释

(a)删除行 (3,4d2):

(b)添加行 (6a5,6):

(c)替换行 (10c10):

(d)替换行 (31c31,32):

(e)这些差异总的可以被理解为:

2、忽略空白字符的差异

3、输出统一格式的差异

4、输出差异摘要

5、并排显示差异

五、高级用法

1、比较目录

2、比较文件夹的差异

3、比较文件的二进制内容

六、扩展用法

1、Colordiff

2、Vimdiff

3、Meld

七、实际应用场景

1. 版本控制

2. 文件备份

3. 代码审查

4. 安全审计


一、概述

        diff 是一个非常有用的 Linux/Unix 命令,用于比较两个或多个文件的内容差异。这个命令广泛应用于版本控制、代码审查、文件比较等场景。下面是对 diff 命令的详细介绍,包括其基本用法、常用选项以及一些高级用法。

       diff 命令是一个非常强大而灵活的工具,可以用于多种场景下的文件比较。技术人员通过掌握其基本用法和高级选项,可以更高效地进行文件比较和管理。

二、用法

1、基本语法        

        diff [选项] 文件1 文件2

2、基本用法

        最简单的用法是直接比较两个文件

                diff testfile1 testfile2

        这将显示 testfile1 和 testfile2 之间的区别。

3、常用选项

        -b:忽略所有空白字符的差别,包括制表符和空格。

        -B:忽略空白行。

        -c:输出一个简短的摘要,包括每组不同的行的上下文。

        -C n:输出每组不同的行及其前后 n 行的上下文。

        -u:以统一格式输出,这是默认格式的改进版,常用于版本控制系统。

        -w:忽略所有非字母数字字符,即只比较字母数字字符。

        -y:以并排格式显示两个文件的不同之处。

        -N:即使文件不存在也进行比较,如果文件在另一个文件中不存在,则认为文件内容为空。

        -q:只报告文件是否相同,不显示具体的差异。

        -s:如果文件相同则报告,否则不输出任何内容。

4、获取帮助

        在命令行中输入指令:

        diff –help

        出现如下图所示的帮助信息:

三、输出格式

        diff命令有三种主要的输出格式:

1、正常格式(normal diff)

        这是diff命令的默认格式,直接显示差异的行和指示符(如a表示添加,c表示更改,d表示删除)。

2、上下文格式(context diff)

        使用-c选项,显示差异前后的几行上下文,有助于更清晰地理解差异的具体位置。

3、合并格式(unified diff)

        使用-u选项,与上下文格式类似,但格式更加简洁,是生成patch文件的推荐格式。

四、示例

1、比较两个文本文件

(1)命令

        diff testfile1.txt testfile2.txt

        这将显示两个文件之间的差异。

(2)实际结果

实际操作如下:

(3)输出解释

(a)删除行 (3,4d2):
  • 这一行指示从文件1(testfile1.txt)中的第3行到第4行的内容被删除,并且这些行在文件2(testfile2.txt)中的位置应该是第2行(但实际上已经被删除了)。
  • < current_datetime=$(date) 表示第3行被删除的内容。
  • < echo "当前日期和时间(默认格式): $current_datetime" 表示第4行被删除的内容。
(b)添加行 (6a5,6):
  • 6a5,6 表示在文件1中的第6行之后添加了新的行,在文件2中的位置是第5行和第6行。
  • > current_time=$(date '+%Y-%m-%d %H:%M:%S') # 获取当前时间 表示新增的第一行。
(c)替换行 (10c10):
  • 10c10 表示文件1中的第10行被替换为文件2中的第10行。
  • < top -b -n 1 | awk ' 表示被替换掉的原有内容。
  • ---: 分割线,用来区分被替换的行和替换后的行。
  • > top -b -n 1 | awk -v mon_time="$current_time" ' 表示替换后的新内容。
(d)替换行 (31c31,32):
  • 31c31,32 表示文件1中的第31行被替换为文件2中的第31行和第32行。

  • < print "" 表示被替换掉的原有内容。

  • ---: 分割线,用来区分被替换的行和替换后的行。

  • > print mon_time "" 表示替换后的新内容第一行。

  • > print "" 表示替换后的新内容第二行。

(e)这些差异总的可以被理解为:
  • 文件2相对于文件1删除了获取和打印当前时间的代码。
  • 文件2在原有代码的基础上增加了获取当前时间的新代码,并且对 awk 命令进行了调整,以便能够包含新的时间变量。
  • 文件2中对某些行进行了修改,以便能够使用新的时间变量 $mon_time 进行输出。

2、忽略空白字符的差异

        使用如下命令:

        diff -b testfile1.txt testfile2.txt

        这将忽略空白字符(如空格和制表符)的差异。

3、输出统一格式的差异

        使用如下命令:

        diff -u testfile1.txt testfile2.txt

        将以统一格式输出差异,是版本控制系统中最常用的格式之一。

4、输出差异摘要

        使用如下命令:

        diff -c testfile1.txt testfile2.txt

        这将输出一个简短的摘要,包括每组不同的行的上下文。

5、并排显示差异

        使用如下命令:

        diff -y testfile1.txt testfile2.txt

        这将以并排格式显示两个文件的不同之处。

五、高级用法

1、比较目录

        可以使用 diff 来比较两个目录的内容,但是需要先使用 find 命令生成目录的内容列表:

        diff <(find dir1 -type f -print) <(find dir2 -type f -print)

        这将比较 dir1 和 dir2 中的文件列表。

2、比较文件夹的差异

        如果想要比较两个目录的内容差异,可以使用 diff 结合 diff 的 -r 选项:

        diff -rq dir1 dir2

        这将递归地比较 dir1 和 dir2 下的所有文件和子目录的内容差异。

3、比较文件的二进制内容

        对于二进制文件,可以使用 cmp 命令来比较文件内容:

        cmp testfile1.bin testfile2.bin

        如果文件内容不同,cmp 将输出第一个不同的字节的位置。

六、扩展用法

        除了基本的 diff 命令外,还有其他一些相关的工具可以使用:

1、Colordiff

彩色输出 diff 的结果,使得差异更加明显。

2、Vimdiff

        使用 Vim 编辑器进行交互式的文件差异比较和合并。

3、Meld

        图形化的差异比较工具,非常适合用于图形界面环境。

七、实际应用场景

1. 版本控制

        在提交代码更改前,使用 diff 检查更改。

2. 文件备份

        比较文件备份和原始文件,确认备份的完整性。

3. 代码审查

        审查代码变更,确保符合编码规范。

4. 安全审计

        检查配置文件的变化,确保没有未经授权的更改。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。



http://www.ppmy.cn/ops/93946.html

相关文章

性能优化之自定义指令实现图片懒加载

1&#xff09;图片懒加载 是常见的用于在页面滚动时动态加载图片&#xff0c;而不是在页面加载时一次性加载所有图片。性能优化必备提高页面加载速度的手段&#xff0c;特别是在包含大量图片的网站上。 图片懒加载的原理&#xff0c;其实就是&#xff0c;当图片出现在视口内时…

【数据结构】顺序表——赋源码(结尾)

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 正文 1. 线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构&#x…

Linux 内核源码分析---挂载文件系统

挂载描述符 Linux 操作系统的一个文件系统&#xff0c;只有挂载到内存中目录树的一个目录下&#xff0c;进程才能够访问这个文件系统。 每次挂载文件系统&#xff0c;虚拟文件系统就会创建一个挂载描述符&#xff08;mount 结构体&#xff09;。 挂载描述符用来描述文件系统的…

BACnet初学者教程,第三章:什么是 BACnet/IP 网络

第三章&#xff1a;什么是 BACnet/IP 网络 平时调试BACnet协议&#xff0c;一个好用的 BACnet 调试工具和模拟器必不可少&#xff0c;推荐一款&#xff1a; 官网地址&#xff1a;BACnet Explorer BACnet/IP 网络是一个或多个 IP 子网&#xff08;IP 域&#xff09;的集合&#…

ubuntu22.04 安装 ros1

ubuntu22.04 安装 ros1 概要 原先只知道ros1 noetic 只支持到ubuntu20.04。现在系统必须升级到ubuntu22.04。 尝试一 Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys 按照这个教程&#xff0c; echo "deb [trustedyes archamd64] http://deb.repo.autolabor.com.cn …

力扣高频SQL 50题(基础版)第四十四题之626. 换座位

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十四题之626. 换座位626. 换座位题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十四题之626. 换座位 626. 换座位 题目说明 表: Seat --------------…

Linux伙伴系统的数据结构关系图

一文轻松理解Linux伙伴系统-CSDN博客 基于如上文章&#xff0c;我们对Linux kernel伙伴系统的数据结构进行了一个梳理&#xff0c;请参考如下所示&#xff1a;

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…

Web开发:如何在同一个局域网中共享文件夹

一、共享设置 二、访问共享 三、取消共享

重修设计模式-创建型-原型模式

重修设计模式-创建型-原型模式 原型模式就是利用已有对象&#xff08;原型&#xff09;通过拷贝方式来创建对象的模式&#xff0c;达到节省对象创建时间的目的。适用于对象创建成本较大&#xff0c;且同一类的不同对象之间差别不大的场景。 比如一个对象中的数据需要经过复杂…

负载均衡之HAProxy超全内容!!!

一、负载均衡 1.1 负载均衡概念 负载均衡&#xff08;Load Balance&#xff0c;简称 LB&#xff09;是高并发、高可用系统必不可少的关键组件&#xff0c;目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 1.2 软件负载均衡 软件…

RCE远程命令执行

命令执行的常用函数 system()&#xff1a;能将字符串作为系统命令执行&#xff0c;且返回命令执行结果。 #system(string $command, int &$result_code null): string|false system(whoami); exec()&#xff1a;能将字符串作为系统命令执行&#xff0c;但是只返回执行结果…

thinkphp中的sql和代码执行

目录 thinkphp5漏洞sql注入 漏洞概要. 漏洞准备 漏洞分析 代码执行 限制条件1 1 2 限制条件 1 限制条件3 php7.x php5 thinkphp5漏洞sql注入 漏洞概要. 本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进…

Day23--前后端分离项目中如何使用 Vue.js 和 Axios 加载 WebServlet 生成的验证码图片

在前后端分离的项目中&#xff0c;使用 Vue.js 作为前端框架&#xff0c;通过 Axios 向后端发送请求以获取验证码图片是一个常见的场景。本文将介绍如何在 Vue 项目中通过 Axios 从后端 WebServlet 获取验证码图片流&#xff0c;并将其加载到前端页面中。 1. 需求分析 在许多…

前端css线性渐变

background: linear-gradient(90deg,red,green); 1.支持多颜色渐变 2.支持多方向渐变 to left to top left 3.支持角度90deg <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA…

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …

傻瓜式一步到位Mysql 8.0 密码修改

5.7之前修改密码语句 update user set authentication_string password(“root”) where user “root”; mysql 5.7.9以后废弃了password字段和password()函数&#xff1b;并在user表加了authentication_string:字段表示用户密码 #进入到mysql 安装目录下 #停止 mysql 服务 …

Oracle子程序

Oracle子程序就是存储在数据库中的PL/SQL块。 1. 存储过程 1.1 语法结构 create [or replace] precedure<存储过程名> [(<参数列表>)] is|as<局部变量声明> begin<执行语句>[exception<异常处理>] end;1.2 案例 无参案例&#xff1a; -- 写…

Python知识点:如何使用Arcade进行简易游戏开发

使用Arcade进行简易游戏开发是一种非常适合初学者的方式。Arcade是一个Python库&#xff0c;它简化了2D游戏开发的许多常见任务&#xff0c;如图像加载、精灵管理、碰撞检测和游戏循环等。以下是如何使用Arcade库进行简易游戏开发的步骤。 1. 安装Arcade 首先&#xff0c;你需…

鸿蒙(API 12 Beta3版)【视频编码】音视频编码

开发者可以调用本模块的Native API接口&#xff0c;完成视频编码&#xff0c;即将未压缩的视频数据压缩成视频码流。 当前支持的编码能力如下&#xff1a; 容器规格视频编码类型mp4HEVC&#xff08;H.265&#xff09;、 AVC&#xff08;H.264&#xff09;m4aHEVC&#xff08;…