如何获取差异以报告新行,已更改行和已删除行的摘要

时间:2009-04-20 07:02:53

标签: unix diff

我希望得到两个文件之间差异的摘要。预期输出是新行,删除行和更改行的计数。 diff很容易提供这样的输出吗?如果没有,那么有任何脚本/实用程序可用于获取摘要。

4 个答案:

答案 0 :(得分:90)

我认为您正在寻找diffstat。只需将diff的输出传递给diffstat,就可以得到类似的内容。

 include/net/bluetooth/l2cap.h |    6 ++++++
 net/bluetooth/l2cap.c         |   18 +++++++++---------
 2 files changed, 15 insertions(+), 9 deletions(-)

答案 1 :(得分:19)

对于那些使用 Git Mercurial 的用户,可以快速查看非暂停更改的摘要:

git diff --stat
hg diff --stat

答案 2 :(得分:14)

如果使用diff -u,它将生成一个统一的差异,其前面带有 + - 的行。如果您通过grep管道输出(仅获取 + - )然后输入wc,您将获得 + es和分别是 -

答案 3 :(得分:2)

以下是suyasha的脚本,所有脚本都使用换行符正确格式化,并添加了一些消息输出。干得好,suyasha,应该把你的回复作为答案。我会投票支持。

#!/bin/bash
# USAGE:    diffstat.sh [file1] [file2]

if [ ! $2 ]
then
   printf "\n   USAGE: diffstat.sh [file1] [file2]\n\n"
   exit
fi

diff -u -s "$1" "$2" > "/tmp/diff_tmp" 
add_lines=`cat "/tmp/diff_tmp" | grep ^+ | wc -l`
del_lines=`cat "/tmp/diff_tmp" | grep ^- | wc -l` 
# igonre diff header (those starting with @@) 
at_lines=`cat "/tmp/diff_tmp" | grep ^@ | wc -l`
chg_lines=`cat "/tmp/diff_tmp" | wc -l`
chg_lines=`expr $chg_lines - $add_lines - $del_lines - $at_lines` 
# subtract header lines from count (those starting with +++ & ---) 
add_lines=`expr $add_lines - 1`
del_lines=`expr $del_lines - 1`
total_change=`expr $chg_lines + $add_lines + $del_lines`
rm /tmp/diff_tmp

printf "Total added lines:  "
printf "%10s\n" "$add_lines"
printf "Total deleted lines:"
printf "%10s\n" "$del_lines"
printf "Modified lines:     "
printf "%10s\n" "$chg_lines"
printf "Total changes:      "
printf "%10s\n" "$total_change"