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

news2024/11/14 5:33:46

目录

一、概述

二、用法

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.coloradmin.cn/o/2039039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试宝典】java多线程面试题总结(中)

::: tip 这个里面的内容对应 Java并发编程基础知识 书籍中的内容。需要的画私聊我哈&#xff01;&#xff01;&#xff01; ::: 一、简介 Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是一种抽象的概念&#xff0c;它定义了Java程序中各个变量…

《计算机组成原理》(第3版)第7章 指令系统 复习笔记

第7章 指令系统 一、机器指令 机器语言是由一条条语句构成的&#xff0c;每一条语句又能准确表达某种语义。计算机就是连续执行每一条机器语句而实现全自动工作的&#xff0c;人们习惯把每一条机器语言的语句称为机器指令&#xff0c;而又将全部机器指令的集合称为机器的指令…

C语言--不可不学的指针

1. 指针是什么 内存是什么&#xff1f; 内存是电脑上特别重要的存储器&#xff0c;计算机中的程序的运行都是在内存中进行的&#xff0c;为了有效使用内存&#xff0c;我们会把内存划分为一个个小的内存单元&#xff0c;比如把4G/8G/16G/32G的内存划分为一个个以字节为单位的空…

vulnhub系列:Momentum2

vulnhub系列&#xff1a;Momentum2 靶机下载 一、信息收集 nmap扫描C段存活 nmap 192.168.23.0/24目标地址为192.168.23.132 nmap扫描端口 nmap 192.168.23.132发现开放端口&#xff1a;22、80 目录扫描 python3 dirsearch.py -u http://192.168.23.132扫描发现目录&…

【OCR 学习笔记】二值化——全局阈值方法

二值化——全局阈值方法 固定阈值方法Otsu算法在OpenCV中的实现固定阈值Otsu算法 图像二值化&#xff08;Image Binarization&#xff09;是指将像素点的灰度值设为0或255&#xff0c;使图像呈现明显的黑白效果。二值化一方面减少了数据维度&#xff0c;另一方面通过排除原图中…

MyBatis--XML映射文件

MyBatis–XML映射文件 lombok工具包 为了解决声明实体类的get()和set()函数臃肿的问题&#xff0c;我们使用lombok工具包。 我们看一下lombok工具包为我们提供的注解&#xff1a; XML映射文件 我们需要遵守下面的规则&#xff1a; 首先XML映射文件和Mapper接口包应该在同…

用栈访问最后若干元素——682、71、388

682. 棒球比赛&#xff08;简单&#xff09; 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&#xff0c;其中 ops[…

2024 Studio One6.6.1最新版中文版图文破解版教程

在数字音频工作站&#xff08;DAW&#xff09;的浩瀚宇宙中&#xff0c;Studio One始终以其独特的魅力和强大的功能脱颖而出。随着6.6.1版本的发布&#xff0c;这款由PreSonus精心打造的音乐制作软件再次迈上了一个全新的台阶&#xff0c;为音乐创作者们带来了前所未有的创作体…

【C++】vector及模拟实现

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、vector的主要函数接口&#x1f4a5;2、vector的模拟实现&#x1f4a5;2.1 构造和析构&…

Python 3 入门基础知识【1】数据类型 安装下载 推荐

Python的重要性这里不多说了&#xff0c;是一门面向对象的解释型语言&#xff0c;使用缩进作为逻辑层次&#xff0c;功能强大且容易上手&#xff0c;其受欢迎程度也在逐年上升的。这里回顾一下python的基础知识&#xff0c;以便自己查看&#xff0c;欢迎正在学习python的同学参…

ArcGIS10.8 安装教程

目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单&#xff08;可选&#xff09; 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境&#xff1a;win7 安装包下载…

[FBCTF2019]RCEService1

打开题目 它给出了提示要求json格式&#xff0c;先尝试一下{"cmd":"ls"} 的确可以执行。接下来就记录过滤了那些关键字。发现键盘上有的特殊符号好像都被过滤。 flag在home目录下&#xff0c;不知道为什么find命令返回为空。。。 cat在这里仍然不能用。…

go语言后端开发学习(六) ——基于雪花算法生成用户ID

前言 在我们日常进行开发的时候,不可避免的会出现对用户表的操作&#xff0c;而为了保证每一个用户的唯一性&#xff0c;这就需要我们创建一个唯一性的id&#xff0c;但是现在有一个问题&#xff0c;如果我们仅仅像通过自增这样方式来创建唯一的id&#xff0c;这无疑是非常不合…

第N5周:Pytorch文本分类入门

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务&#xff1a; ●1. 了解文本分类的基本流程 ●2. 学习常用数据清洗方法 ●3. 学习如何使用jieba实现英文分词 ●4. 学习如何构建文本向量 一、前期准备 环境安装 这是一个使用PyTorch实现的简单文…

超详细教程:贴片电阻要怎么焊接?

在电子硬件中&#xff0c;焊接是必不可少的一个技能。 但是在实际的学习或者工作过程中&#xff0c;往往会碰上各种各样的焊接条件&#xff0c;焊接环境&#xff0c;如果是对于直插式的元件&#xff0c;比如说焊接一个直插式LED灯或者直插式电解电容&#xff0c;可能很容易焊接…

15个网络工程师必须记住的专业术语和概念

网络工程师在日常工作中确实需要掌握大量的专业术语和概念&#xff0c;这些术语和概念是理解和应用网络技术的基础。以下是一些网络工程师必知的重要术语及其应用场景&#xff1a; 1. IP地址&#xff08;IP Address&#xff09; 定义&#xff1a;互联网协议地址&#xff0c;用…

Elasticsearch 8 RAG 技术分享

作者&#xff1a;来自 Elastic 中国区首席架构师 Jerry 本文由 Elastic 中国区首席架构师 Jerry Zhu 在【AI 搜索 TechDay】上的分享整理而成。【AI 搜索 TechDay】 是 Elastic 和阿里云联合主办的 AI 技术 Meetup 系列&#xff0c;聚焦企业级 AI 搜索应用和开发者动手实践&am…

framebuffer总结

FrameBuffer&#xff0c;可以译作"帧缓冲"&#xff0c;有时简称为 fbdrv。 这是一种独立于硬件的抽象图形设备。 是Linux为显示设备提供的一个接口&#xff0c;把显存抽象后的一种设备&#xff0c; 允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作 什么是…

QT 网络聊天室简易版

视频:qt开发网络聊天w室软件3.4界面开发_哔哩哔哩_bilibili 目录 UI部分 设计稿图 放置控件 界面美化 拖动窗体 设置界面 网络部分 配置对话框 多项目结果和服务器端设计 客户端框架开发 UI部分 设计稿图 放置控件 界面美化 现在我们把窗体自带的标题栏给去了,用我们自…