linux常用命令--diff
diff是Unix系统的一个很重要的工具程序。
它用来比较两个文本文件的差异,是代码版本管理的基石之一。你在命令行下,输入:
$ diff <变动前的文件> <变动后的文件>
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件。也使用patch命令对相应的文件打补丁。它的显示结果不太好懂,下面我就来说明,如何读懂diff。
FILES的格式:FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。
DIR1 DIR2 :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。
FILE DIR :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。
DIR FILE :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。
FILE可以是“-”,代表由标准输入设备读入的文本。DIR不能是"-"。
被指定的文件不能是标准的输入。
短选项 | 长选项 | 含义 |
---|---|---|
-i | --ignore-case | 忽略文件内容大小写的区别 |
--ignore-file-name-case | 忽略文件名大小写的区别 | |
--no-ignore-file-name-case | 不忽略文件名大小写的区别 | |
-E | --ignore-tab-expansion | 忽略由制表符宽度造成的差异 |
-b | --ignore-space-change | 忽略由空格数不同造成的差异 |
-w | --ignore-all-space | 忽略所有空格 |
-B | --ignore-blank-lines | 忽略任何因空行而造成的差异 |
-I | --ignore-matching-lines=RE | 如果某行匹配正则表达式,则忽略由该行造成的差异 |
-a | --text | 所有文件都以文本方式处理 |
--strip-trailing-cr | 去除输入内容每行末端的 carriage return 字符 | |
-c 或 或 -C 行数 | --context[=行数] | 显示指定<行数>(默认 3 行)copied 格式的上下文 |
-u 或 -U 行数 | --unified[=行数] | 显示指定<行数>(默认 3 行)unified 格式的上下文(合并的方式) |
--label 标识 | 使用<标识>代替文件名称 | |
-p | --show-c-function | 显示和每个差异有关的 C 函数名称 |
-F | --show-function-line=RE | 显示最接近而符合<正则表示式>的一行 |
-q | --brief | 只显示文件是否不同 |
-e | --ed | 以 ed script 方式输出 |
--normal | 以正常的 diff 方式输出 | |
-n | --rcs | 以 RCS diff 格式输出 |
-y | --side-by-side | 以两列并排的方式显示 |
-W | --width=NUM | 每行显示最多 NUM (默认 130) 个字符 |
--left-column | 当有两行相同时只显示左边的一行 | |
--suppress-common-lines | 当有两行相同时不会显示 | |
-D | --ifdef=NAME | 输出的内容以‘#ifdef NAME’方式标明差异 |
--GTYPE-group-format=GFMT |
效果类似,但会以 GFMT 格式处理 GTYPE 输入的行 可以是LTYPE的选择或是‘changed’ |
|
--line-format=LFMT | 效果类似,但会以 LFMT 格式处理每一行资料 | |
--LTYPE-line-format=LFMT |
效果类似,但会以 LFMT 格式处理 LTYPE 输入的行 LTYPE 可以是‘old’、‘new’或‘unchanged’。 |
|
-l | --paginate | 将输出送至‘pr’指令来分页 |
-t | --expand-tabs | 将输出中的 tab 转换成空格 |
-T | --initial-tab | 每行先加上 tab 字符,使 tab 字符可以对齐 |
--tabsize=NUM | 定位字符 (tab) 的宽度,默认为 8 个空格宽 | |
--suppress-blank-empty | suppress space or tab before empty output lines | |
-r | --recursive | 递归比较子目录中的文件 |
-N | --new-file | 不存在的文件以空文件方式处理 |
--unidirectional-new-file | 若第一文件案不存在,以空文件处理 | |
-s | --report-identical-files | 文件相同则报告,否则无任何提示 |
-x | --exclude=PAT | 排除匹配 PAT 的文件 |
-X | --exclude-from=FILE | 排除所有匹配在 FILE 中列出的模式的文件 |
-S | --starting-file=FILE | 当比较目录時,由 FILE 开始比较 |
--from-file=FILE1 | 将 FILE1 和操作数中的所有文件/目录作比较。FILE1 可以是目录 | |
--to-file=FILE2 | 将操作数中的所有文件/目录和 FILE2 作比较。FILE2 可以是目录 | |
--horizon-lines=NUM | keep NUM lines of the common prefix and suffix | |
-d | --minimal | 尽可能找出最小的差异 |
--speed-large-files | 假设文件十分大而且其中含有许多微小的差异 |
一、diff的三种格式
由于历史原因,diff有三种格式:
* 正常格式(normal diff)
* 上下文格式(context diff)
* 合并格式(unified diff)
我们依次来看。
二、示例文件
为了便于讲解,先新建两个示例文件。
log2014.log内容
2013-01
2013-02
2014-03
2013-04
2013-05
2013-06
2013-07
2013-07
2013-09
2013-10
2013-11
2013-12 log2013.log内容
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10
三、正常格式的diff
diff输出格式(默认):
n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
n1,n2 d n3 表示删除n1到n2行,合并到目标文件的n3行
n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替换掉
字母a:表示附加(add)
字符c:表示修改(change)
字符d:表示删除(delete)
字母前的是源文件,字母后是目标文件。Nx表示行号。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
比较两个文件
[root@localhost test3]# diff log2014.log log2013.log
3c3
< 2014-03
---
> 2013-03
8c8
< 2013-07
---
> 2013-08
11,12d10
< 2013-11
< 2013-12
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
并排格式输出
[root@localhost test3]# diff log2014.log log2013.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11 <
2013-12 < [root@localhost test3]# diff log2013.log log2014.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10 > 2013-11 > 2013-12
说明:
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容
四、上下文格式的diff
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。
它的使用方法是加入c参数(代表context)。
[root@localhost test3]# diff log2013.log log2014.log -c
显示结果如下:
*** log2013.log 2012-12-07 16:36:26.000000000 +0800
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
***************
*** 1,10 **** 2013-01 2013-02
! 2013-03 2013-04 2013-05 2013-06 2013-07
! 2013-08 2013-09 2013-10
--- 1,12 ---- 2013-01 2013-02
! 2014-03 2013-04 2013-05 2013-06 2013-07
! 2013-07 2013-09 2013-10
+ 2013-11
+ 2013-12
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:
“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行
[root@localhost test3]# diff log2014.log log2013.log -c
*** log2014.log 2012-12-07 18:01:54.000000000 +0800
--- log2013.log 2012-12-07 16:36:26.000000000 +0800
***************
*** 1,12 **** 2013-01 2013-02
! 2014-03 2013-04 2013-05 2013-06 2013-07
! 2013-07 2013-09 2013-10
- 2013-11
- 2013-12
--- 1,10 ---- 2013-01 2013-02
! 2013-03 2013-04 2013-05 2013-06 2013-07
! 2013-08 2013-09 2013-10
五、合并格式的diff
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将比较文件的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。
[root@localhost test3]# diff log2014.log log2013.log -u
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
@@ -1,12 +1,10 @@ 2013-01 2013-02
-2014-03
+2013-03 2013-04 2013-05 2013-06 2013-07
-2013-07
+2013-08 2013-09 2013-10
-2013-11
-2013-12
第一部分,也是文件的基本信息:
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
"---"表示变动前的文件,"+++"表示变动后的文件。
第二部分,变动的位置用两个@作为起首和结束
@@ -1,12 +1,10 @@
前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。意思:第一个文件从第1行开始的连续12行。
同样的,"+1,10" 表示第二个文件从第1行开始的连续10行。
参考链接
http://www.lampweb.org/linux/3/17.html
http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html
转载于:https://www.cnblogs.com/stemon/p/5754542.html
linux常用命令--diff相关推荐
- DOS 和 Linux 常用命令的对比
此为转载文章,转自:http://www.huihoo.org/gnu_linux/ch-doslinux.html Red Hat Linux 9: Red Hat Linux 入门指南 后退 前进 ...
- Linux 常用命令使用方法
Linux 常用命令使用方法 1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的 ...
- Linux 常用命令全称,看看你 get 到了哪些?
作者丨飘飘雪 https://www.cnblogs.com/wangcp-2014/p/6539035.html 从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多, ...
- Linux常用命令英文全称与中文解释Linux系统
Linux常用命令英文全称与中文解释Linux系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 意思是密码. su: ...
- linux 复制包括子目录_【Linux分享】Linux常用命令+教程分享
今天分享分为两部分 :)PART01 Linux常用命令分享/PART02 关于BD面试经验分享 30mins Linux Command:PART 1 你本可以张口就来.....本篇内容分享 ...
- linux常用命令_Linux常用命令全称
从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧! 必备Linux命令和C语言基础_C语言_嵌入式开发工程师-创客学院www. ...
- linux定位so快捷方式_5分钟带你了解Linux常用命令全称
从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧! pwd:print work directory 打印当前目录 显示出当前工 ...
- 《快学BigData》--Linux 常用命令
Linux 常用命令 awk / arch / bc / cp / clock -w / chmod / chkconfig / cal / cut /chmod / cat / crotable ...
- Linux 常用命令整理(Centos7) (时区/正则/sed/htop/screen/ln/awk/……)
目录 Linux 常用命令整理(Centos7) (附加正则.时区.git等) 一.系统查询常用命令: 1.文件中空格制表符替换sed 2.查看宿主机的用户名密码 3.last .w.lastb 查看 ...
最新文章
- darknet53网络结构及配置文件对比
- graphql_普通英语GraphQL指南
- 用git提交代码时,由于进程加锁,突然崩溃,未来得及解锁,导致其他进程访问不了...
- 一个CSS的px值转rem值的Sublime Text 3自动完成插件
- JS中避免命名冲突的三个方法
- SQL 语句时间比较
- Proteus仿真单片机:51单片机的仿真
- 信息学奥赛一本通C++语言——1005:地球人口承载力估计
- 【报告分享】2020快手电商生态报告.pdf(附下载链接)
- java实现对象转换为map、xml字符串转化为map、map转化为xml字符串
- Unity给力插件之ShaderForge
- Java编程入门:使用Eclipse快捷键
- uniapp使用IPA苹果支付
- Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?
- 零基础Unreal Engine 4(UE4)图文笔记之基础篇-基本操作(二)
- codeforces Intel Code Challenge Final Round (div.1 + div.2 combined)
- 那个时候我不小心改写了Bash ...
- centos php5.4 升级 php7
- php写字板代码,Android实现画板、写字板功能(附源码下载)
- pku1160 Post Office
热门文章
- boost::contract模块实现customer and manager的测试程序
- ITK:在一幅图像中提取感兴趣区域ROI
- VTK:Utilities之ReportRenderWindowCapabilities
- OpenCV PCA提取对象的方向的实例(附完整代码)
- Qt CMake变量参考
- Qt Creator连接Android设备
- C语言求一棵二叉树所有根到叶的路径(附完整源码)
- C语言求最大公约数GCD的算法(附完整源码)
- C++Heap Sort堆排序的实现算法(附完整源码)
- C++Exponential search指数搜索的实现算法(附完整源码)