Linux diffstat ( diff statistics ) 命令用以统计概要图的形式显示 diff 命令的输出结果,更容易了解两个文件的变化。

diffstat 命令的定义解释

diffstat ( diff statistics ) 命令用以统计概要图的形式显示 diff 命令的输出结果。它可以通过管道(|)或从文件读取 diff 命令输出,并生成两文件对比的统计直方图,它可以读取 diff 命令输出的所有格式,例如:联合格式(unified)、上下文格式和正常格式。

diffstat 命令安装

默认在很多系统中(不论是 Linux 还是 FreeBSD)都没有安装 diffstat 命令,要使用 diffstat 命令首先要安装它。

1、Debian、Ubuntu 系统安装 diffstat 命令:

sudo apt install diffstat

2、RHEL、AlmaLinux、Rocky Linux 系统安装 diffstat 命令:

sudo dnf install diffstat

3、Arch Linux 系统安装 diffstat 命令:

sudo pacman -S diffstat

4、FreeBSD 系统安装 diffstat 命令:

sudo pkg install diffstat

diffstat 命令语法

diffstat [选项] [对比文件]
diff [选项] [源文件] [目标文件] | diffstat [选项]
  • [对比文件]diff 的对比输出结果
  • 第二个语法为从管道 | 读取输出

diffstat 命令输出解释及示例

要理解 diffstat 命令的输出结果首先要了解 diff 命令的输出结果

diff 命令的输出格式是以第一个文件(源文件)为参考标准,标记第二个文件(目标文件)所具有的差异。所以在 diffstat 命令中使用 第二个文件(目标文件)的名字 作为统计图的名称。

diff -c file1.txt file2.txt | diffstat

输出内容为:

file2.txt |    5 +-!!!
1 file changed, 1 insertion(+), 1 deletion(-), 3 modifications(!)

diffstat 输出样式解释

输出样式会是如下形式:

第二个文件名 |    总变化数  [+...] [-...] [!...]
......
n file changed, i insertion(+), j deletion(-), k modifications(!)

符号说明:

符号 解释说明
+ 变化为添加内容行
- 变化为删除了内容行
! 变化为更改了内容行

样式解释说明:

  • 除最后一行的每一行表示一次对比结果的统计。每个对比统计的内容为:以对比的 第二个文件名 作为统计名(找不到文件名时,使用 unknown),总变化数 为添加、删除、更改的总次数,+ 个数为添加了多少行,- 个数为删除了多少行;! 个数为更改了多少行
  • 最后一行内容为:n file changed 为该对比结果中,包含了 n 次对比的结果;i insertion(+) 共有 i 次添加;j deletion(-) 共有 j 次删除;k modifications(!) 共有 k 次更改。

对比文件包含两次对比结果的示例

生成对比文件:

diff -c file1.txt file2.txt > filediff.txt
diff -c file1.txt file3.txt >> filediff.txt

> 为输出内容替换文件的内容,>> 为输出内容附加到文件的尾部。

使用 diffstat 命令生成对比统计直方图:

diffstat filediff.txt

输出结果为:

 file2.txt |    5 +-!!!
 file3.txt |    5 +!!!!
 2 files changed, 2 insertions(+), 1 deletion(-), 7 modifications(!)

现在就可以根据我们的解释理解文件包含两次对比结果的输出内容啦。

为输出结果添加颜色区别

要为 diffstat 命令的输出结果添加颜色区别具体变化,使用 -C 选项:

diffstat -C filediff.txt

diffstat 命令选项解释

如下给出了 Linux diffstat 命令中所有选项的解释说明:

选项 解释说明
- b 忽略 diff 输出结果中的 "Binary files XXX and YYY differ" 的行
-c 用“#”作为每一行输出的前缀,使其成为shell脚本的注释行
-C 添加 SGR 颜色转义序列以突出显示直方图
-D 目标 指定一个目录,其中包含可以作为对比结果引用的文件。Diffstat将计算相应文件中的行数(在通过 -p 选项调整名称之后),以获得每个文件中的总行数。减去修改和删除的行后的余数显示为“未修改行”
-d 调试输出大量信息。它通常是编译内的,但也可以被抑制。
-e file 重定向错误信息输出到文件
-E 在解析差异之前,去掉每行上的 ANSI 转义序列。这允许diffstat与colordiff一起使用
-f format 指定统计直方图的输出格式,可以取以下值:
0 :为了简洁起见,只使用单个直方图代码显示添加(+)、删除(-)或更改(!)的值
1 :正常输出(默认)
2 :使用点在尾部填充统计直方图
4 :每个值都使用一个直方图
任意非零值都对应一个直方图,使用值的和混合多种直方图的输出形式,例如:-f 6-f6 混合了 24 两种格式的直方图
-h 显示帮助信息后退出
-k 禁止合并报表中的文件名
-K 通过在结果文件集中查找匹配项并推断文件是否已添加或删除,尝试改进“only”文件的注释。这目前不能与 -R 结合使用,因为 diffstat 只维护结果文件集。
-l 不输出直方图,只输出文件名
-m 合并 patch 文件中每个“块”的添加/删除计数,以近似于修改行的计数。
-n number 指定文件名使用的最小宽度。如果没有指定,diffstat 将在去掉通用前缀后使用最长文件名的长度。
-N number 指定文件名使用的最大宽度。超过此限制的名称在左侧被截断。如果没有指定,diffstat 接下来会检查 -n 选项。
-o file 将标准输出重定向到文件。
-p number 覆盖剥离公共路径名的逻辑,模拟 patch -p 选项。如果不提供-p选项,diffstat 将检查差异并从路径名中去掉公共前缀。这不是 patch 的功能。
-q 对于空差异,禁止输出 “0 files changed” 。
-r code 为直方图中显示的数据提供可选的四舍五入,而不是用误差调整截断。
0 :默认值,不执行四舍五入,但将累积的错误添加到后面的列中
1 :四舍五入数据 2 :对数据进行四舍五入并调整直方图,以确保在存在任何差异时显示这些内容,即使这些差异通常会被四舍五入为零。
-R 假设 patch 是在新旧文件交换后创建的
-s 仅显示摘要行,例如:插入和删除的数量
-S source 类似于-D选项,但指定了一个可以找到原始文件的位置(在应用差异之前)。
-t 覆盖直方图,为每个文件的对比差异中发现的变化行(插入、删除和更改)数生成以逗号分隔的值。如果给出了 -S-D 选项,则未更改的行数在更改的行数之前。
-T 在路径名和直方图之间,输出 -t 选项需要显示的数字。更改数的宽度由最大值(但至少为3)决定。选项 -w 中给出的宽度与这些数字的宽度是分开的。
-u 禁止对输出中的文件名进行排序
-v 显示进度,例如,如果输出被重定向到一个文件,则将进度消息写入标准错误。
-V 显示版本信息后退出
-w number 指定直方图的最大宽度,以防文件名变得太大。直方图永远不会少于10列。默认值是80列,除非输出到终端。在这种情况下,默认宽度是终端的宽度。

结语

在本教程中我们介绍了如何使用 diffstat ( diff statistics ) 命令用以统计概要图的形式显示 diff 命令的输出结果。它可以通过管道(|)或从文件读取 diff 命令输出,并生成两文件对比的统计直方图,它可以读取 diff 命令输出的所有格式,例如:联合格式(unified)、上下文格式和正常格式。

该 diffstat 命令可以在 Linux 系统中使用,也可以在 FreeBSD 系统中使用。