Как получить diff для отчета о новых, измененных и удаленных строках

Я хочу получить сводку различий между двумя файлами. Ожидаемый результат - количество новых, удаленных и измененных строк. Обеспечивает ли diff такой вывод? Если нет, доступны ли скрипты / утилиты, помогающие получить сводку.


person Community    schedule 20.04.2009    source источник


Ответы (4)


Если вы используете diff -u, он будет генерировать унифицированный diff, в котором строки начинаются с + и -. Если вы отправите этот вывод через grep (чтобы получить только + или -), а затем в wc, вы получите счетчики для + es и - соответственно.

person Community    schedule 20.04.2009
comment
Спасибо, вот скриптлет оболочки bash для того же diff -u -s $ file1 $ file2 ›$ diff_file add_lines = cat "$diff_file" | grep ^+ | wc -l del_lines = cat "$diff_file" | grep ^- | wc -l # igonre diff header (те, которые начинаются с @@) at_lines = cat "$diff_file" | grep ^@ | wc -l chg_lines = cat "$diff_file" | wc -l chg_lines = expr $chg_lines - $add_lines - $del_lines - $at_lines # вычесть строки заголовка из count (начинающиеся с +++ & ---) add_lines = expr $add_lines - 1 del_lines = expr $del_lines - 1 total_change = expr $chg_lines + $add_lines + $del_lines - person suyasha; 07.05.2009
comment
@suyasha: Не могли бы вы опубликовать это правильно, как ответ с переносом строки? Мне было бы интересно запустить это. - person Lightness Races in Orbit; 22.08.2016

Я думаю, вы ищете diffstat. Просто направьте вывод diff в diffstat, и вы должны получить что-то вроде этого.

 include/net/bluetooth/l2cap.h |    6 ++++++
 net/bluetooth/l2cap.c         |   18 +++++++++---------
 2 files changed, 15 insertions(+), 9 deletions(-)
person Community    schedule 20.04.2009
comment
Спасибо: это именно тот инструмент, который мне нужен. - person Paul Johnson; 02.02.2012
comment
Для тех из нас, кто пользуется Mac с установленным Homebrew. Просто установите его через brew install diffstat. - person Jens Kohl; 15.04.2015
comment
Чтобы напечатать имя файла, вам нужно, чтобы разница была унифицирована diff -u foo1/bar.cpp foo2/bar.cpp | diffstat будет кричать bar.cpp | 6 ++++++. Если не унифицировано, имя файла будет unknown. - person Vser; 20.09.2019
comment
Это должен быть принятый ответ - person TheMadsen; 11.03.2021

Для тех, кто использует Git или Mercurial, быстрый способ увидеть такую ​​сводку своих неустановленных изменений:

git diff --stat
hg diff --stat
person Community    schedule 12.06.2013

Вот скрипт от 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"
person Community    schedule 08.03.2017