Как получить diff для отчета о новых, измененных и удаленных строках - PullRequest
44 голосов
/ 20 апреля 2009

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

Ответы [ 4 ]

91 голосов
/ 20 апреля 2009

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

 include/net/bluetooth/l2cap.h |    6 ++++++
 net/bluetooth/l2cap.c         |   18 +++++++++---------
 2 files changed, 15 insertions(+), 9 deletions(-)
19 голосов
/ 12 июня 2013

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

git diff --stat
hg diff --stat
14 голосов
/ 20 апреля 2009

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

2 голосов
/ 08 марта 2017

Вот скрипт 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"
...