Bootstrap

Linux(Centos 7.6)命令详解:diff

1.命令作用

逐行比较文件内容(Compare FILES line by line)

2.命令语法

Usage: diff [OPTION]... FILES

3.参数详解

OPTION:

  • --normal,输出一个标准的不同信息(默认参数,可以忽略该参数)
  • -q, --brief,仅当文件不同时汇报(文件相同不输出任何内容,不同时仅提示文件不同)
  • -s, --report-identical-files,当两个文件相同时报告(文件相同时仅提示文件相同,不同时参考--normal的标准输出)
  • -c, -C NUM, --context[=NUM],以复制上下文的方式输出(即两文件分开输出,标记不同处)
  • -u, -U NUM, --unified[=NUM],以统一上下文的方式输出(即两文件一起输出,标记不同处)
  • -e, --ed,输出一个ed脚本(脚本描述如果将file1怎么修改为file2)
  • -n, --rcs,输出一个RCS格式差异
  • -y, --side-by-side,两列/并列格式输出差异
  • -W, --width=NUM,两列/并列格式输出时,指定显示的宽度(默认为130字节)
  • --left-column,两列/并列格式输出时,只输出相同行的左文件列
  • --suppress-common-lines,两列/并列格式输出时,不输出相同行
  • -p, --show-c-function,显示每个更改的C函数,与-c差不多
  • -F, --show-function-line=RE,显示与正则表达式RE匹配的最新一行
  • --label LABEL,使用LABEL代替文件名
  • -t, --expand-tabs,在输出中将制表符展开为空格
  • -T, --initial-tab,通过添加制表符使制表符对齐
  • --tabsize=NUM,两列/并列格式输出时,tab制表符每NUM打印列
  • --suppress-blank-empty,在空输出行前禁止空格或制表符
  • -l, --paginate,通过'pr'传递输出以对其进行分页
  • -r, --recursive,递归地比较找到的所有子目录
  • --no-dereference,不要使用符号链接
  • -N, --new-file,将不存在的文件视为空文件
  • --unidirectional-new-file,将不存在的第一个文件视为空文件
  • --ignore-file-name-case,比较文件名时忽略大小写
  • --no-ignore-file-name-case,比较文件名时要考虑大小写
  • -x, --exclude=PAT,目录对比时,排除与PAT匹配的文件
  • -X, --exclude-from=FILE,排除与FILE内容中文件名匹配的文件
  • -S, --starting-file=FILE,比较目录时从FILE开始,仅显示FILE不同对比之后的内容
  • --from-file=FILE1,比较FILE1和所有操作数,FILE1可以是一个目录
  • --to-file=FILE2,比较所有操作数与FILE2,FILE2可以是一个目录
  • -i, --ignore-case,忽略文件内容中的大小写差异
  • -E, --ignore-tab-expansion,忽略由于TAB扩展而引起的更改
  • -Z, --ignore-trailing-space,忽略行尾的空白
  • -b, --ignore-space-change,忽略空白量的变化
  • -w, --ignore-all-space,忽略所有空白
  • -B, --ignore-blank-lines,忽略行全为空的更改
  • -I, --ignore-matching-lines=RE,忽略所有行匹配正则的更改
  • -a, --text,将所有文件视为文本(如把二进制也视为文本文件)
  • --strip-trailing-cr,忽略行尾的回车符差异(如Windows与Linux文件的对比)
  • -D, --ifdef=NAME,输出与'#ifdef NAME'不同的合并文件
  • --GTYPE-group-format=GFMT,格式GTYPE输入组与GFMT
  • --line-format=LFMT,用LFMT格式化所有输入行
  • --LTYPE-line-format=LFMT,用LFMT格式化LTYPE输入行
  • -d, --minimal,使用不同的算法以较小的单位进行比较(和默认显示格式差不多)
  • --horizon-lines=NUM,保留通用前缀和后缀的NUM行
  • --speed-large-files,用于提升大文件对比的效率

以上参数没有加粗即标色的未测试出显著效果,望广大网友评论区赐教

4.常用用例

4.1.四种输出格式

对比文件内容

[root@node2 Desktop]# cat test1.txt 
aaa	aaa
bbbbbb
cccccc
dddddd
111111
222222
333333
444444
[root@node2 Desktop]# cat test2.txt 
aaa aaa
cccccc
bbbbbb
dddddd
111111
333333
444444
222222
eeeeee

4.1.1.正常格式(--normal)

正常默认格式对比输出

[root@node2 Desktop]# diff test1.txt test2.txt 
1,2c1
< aaa	aaa
< bbbbbb
---
> aaa aaa
3a3
> bbbbbb
6d5
< 222222
8a8,9
> 222222
> eeeeee
[root@node2 Desktop]# 

输出说明: 

  • 输出结果实质是,用以说明test1.txt变成test2.txt需要做哪些改变。
  • 1,2c1,c前面的1,2代表test1.txt的第1行到第2行,c后面的1代表文件test2.txt的第1行,c(change)代表变化;输出前5行意思是test1.txt变成test2.txt,需要将test1.txt文件的第1行到第二行改成test2.txt的第一行
  • 3a3,a前后的3分布代表test1.txt和test2.txt的第3行,a(add)代表添加;输出第6-7行意思是test1.txt变成test2.txt,需要test1.txt文件的第三行后添加bbbbbb
  • 6d5,d前后的6和5分布代表test1.txt的第6行和test2.txt的第5行,d(delete)代表删除;输出的8-9行意思是test1.txt变成test2.txt,需要删除test1.txt的第6行
  • 8a8,9,输出的最后3行意思是test1.txt变成test2.txt,需要test1.txt文件第8行后添加222222和eeeeee两行,然后与test2.txt的第8-9行一样

输出总结说明:

  • 字母a代表添加(add)、c代表变化(change)、d代表删除(delete)
  • 字符前后数字代表对比的两个文件的内容行数,如1,3代表1至3行,包括第二行
  • < 代表左边文件内容
  • > 代表右边文件内容
  • --- 用于分割两个文件不同内容的分割线

4.1.2.上下文格式(-c, -C NUM)

上下文格式对比输出

[root@node2 Desktop]# diff -c test1.txt test2.txt 
*** test1.txt	2025-02-20 17:22:32.986170929 +0800
--- test2.txt	2025-02-20 17:00:37.925138321 +0800
***************
*** 1,8 ****
! aaa	aaa
! bbbbbb
  cccccc
  dddddd
  111111
- 222222
  333333
  444444
--- 1,9 ----
! aaa aaa
  cccccc
+ bbbbbb
  dddddd
  111111
  333333
  444444
+ 222222
+ eeeeee

 输出总结说明:

  • ***部分显示左边文件,---部分显示右边文件内容
  • 文件后的时间是文件最后修改时间
  • 1,8 代表1至8行,1,9 代表1至9行
  • ! 类似 c ,改变
  • + 类似 a,添加
  • - 类似 d,删除

4.1.3.合并格式(-u, -U NUM)

合并格式对比输出

[root@node2 Desktop]# diff -u test1.txt test2.txt 
--- test1.txt	2025-02-20 17:22:32.986170929 +0800
+++ test2.txt	2025-02-20 17:00:37.925138321 +0800
@@ -1,8 +1,9 @@
-aaa	aaa
-bbbbbb
+aaa aaa
 cccccc
+bbbbbb
 dddddd
 111111
-222222
 333333
 444444
+222222
+eeeeee

 输出总结说明:

  • ---部分显示左边文件,+++部分显示右边文件内容
  • 文件后的时间是文件最后修改时间
  • @@ -1,8 +1,9 @@代表两个文件的行,-1,8代表左边文件的1至8行,+1,9代表右边文件的1至9行
  • - 代表删除
  • + 代表添加

4.1.4.并列格式(-y, --side-by-side)

并列格式对比输出

[root@node2 Desktop]# diff -y test1.txt test2.txt 
aaa	aaa						      |	aaa aaa
bbbbbb							      <
cccccc								cccccc
							      >	bbbbbb
dddddd								dddddd
111111								111111
222222							      <
333333								333333
444444								444444
							      >	222222
							      >	eeeeee
[root@node2 Desktop]# 

 输出总结说明:

  • | 代表前后/左右两个文件内容有不同
  • < 代表左边文件比右边文件多内容
  • > 代表左边文件比右边文件少内容

4.2.其他常用对比输出

4.2.1.目录对比(-r, --recursive)

[root@node2 ~]# diff -r Desktop/ dir1
Only in Desktop/: aaa
Only in Desktop/: AAA
Only in Desktop/: aaaa
Only in Desktop/: bbb
Only in Desktop/: hostname
Only in Desktop/: test
diff -r Desktop/test1.txt dir1/test1.txt
2c2
< bbbbbb
---
> 
[root@node2 ~]# 

输出说明:

  • 前6行代表仅左边目录存在文件,右边目录不存在的文件
  • 后5行代表左右两个目录test1.txt文件内容不同

4.2.2.忽略空格对比(-Z、-b、-w)

## 文件test3.txt第一行尾有tab,第二行尾有空格
[root@node2 Desktop]# diff test3.txt test4.txt 
1,2c1,2
< aaaaaa	
< bbbbbb 
---
> aaaaaa
> bbbbbb
[root@node2 Desktop]# diff -Z test3.txt test4.txt
[root@node2 Desktop]# diff -b test3.txt test4.txt 
[root@node2 Desktop]# diff -w test3.txt test4.txt
[root@node2 Desktop]# 

## test5.txt第一行中间有tab,第二行有一个空格
[root@node2 Desktop]# diff test5.txt test6.txt 
1,3c1,3
< aaa	aaa
< bbb bbb
< ccc ccc
---
> aaaaaa
> bbbbbb
> ccc	ccc
[root@node2 Desktop]# diff -Z test5.txt test6.txt 
1,3c1,3
< aaa	aaa
< bbb bbb
< ccc ccc
---
> aaaaaa
> bbbbbb
> ccc	ccc
[root@node2 Desktop]# diff -b test5.txt test6.txt 
1,2c1,2
< aaa	aaa
< bbb bbb
---
> aaaaaa
> bbbbbb
[root@node2 Desktop]# diff -w test5.txt test6.txt 
[root@node2 Desktop]# 

 忽略空格输出说明:

  • -Z 是忽略行尾的空格或tab,空格/tab在中间的不能忽略
  • -b 忽略空白量,即多个空格相当于一个空格
  • -w 忽略所有空格,包括行中间或者行尾

4.2.3.忽略空行对比(-B)

[root@node2 Desktop]# cat test7.txt
aaaaaa

bbbbbb

cccccc
[root@node2 Desktop]# cat test8.txt
aaaaaa
bbbbbb
cccccc
[root@node2 Desktop]# diff test7.txt test8.txt 
2d1
< 
4d2
< 
[root@node2 Desktop]# diff -B test7.txt test8.txt 
[root@node2 Desktop]# 
;