Есть ли сжатый формат diff-бок о бок?

40

У меня есть два файла журнала с тысячами строк. После предварительной обработки отличаются только некоторые строки. Эти оставшиеся строки являются либо реальными различиями, либо перетасованными группами линий.

Унифицированные различия позволяют мне видеть подробные различия, но это затрудняет ручное сравнение с глазными яблоками. Дифференциальные различия кажутся более полезными для сравнения, но они также добавляют тысячи неизмененных строк. Есть ли способ получить преимущество обоих миров?

Обратите внимание, что эти файлы журнала создаются xscopeпрограммой, которая отслеживает данные протокола Xorg. Я ищу инструменты общего назначения, которые можно применять в ситуациях, подобных описанным выше, например, не специализированные инструменты анализа журналов доступа к веб-серверу.


Два примера файлов журнала доступны по адресу http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13и log14). В xscope-filterфайле находится команда препроцессора, которая удаляет временные метки и другие мелкие детали.

Lekensteyn
источник
2
Есть ли у diffвас --suppress-common-linesвариант? pastebin.com/KZrVCNFR
manatwork
1
@ Manatwork Хорошо, это так. Любой способ добавить больше контекста (например, номера строк)?
Лекенштейн
5
Тогда, может быть vimdiff(из пакета vim ) будет лучше удовлетворять ваши потребности: параллельное отображение, раскрашены, общие линии сложены. Номера строк можно включить с помощью :set number.
manatwork
Я думаю, что вы должны поставить vimdiff в качестве ответа :)
Kotte
1
Инструменты CLI предпочтительнее, но инструменты GUI также разрешены, если они достаточно малы. Я пробовал kdiff3, но он все еще продуман до мелочей. В идеале я не вижу всех лишних деталей. Я приложу два набора данных.
Лекенштейн

Ответы:

37

2 инструмента сравнения, которые я использую больше всего, будут meld и sdiff .

MELD

Meld - это графический интерфейс, но он отлично показывает разницу между файлами. Он больше предназначен для разработки программного обеспечения с такими функциями, как возможность перемещать изменения с одной стороны на другую, чтобы объединять изменения, но его можно использовать как простой инструмент сравнения друг с другом.

    слияние

    ss подсветки кода

SDiff

Я использовал этот инструмент в течение многих лет. Я обычно запускаю его со следующими переключателями:

$ sdiff -bBWs file1 file2
  • -b Игнорировать изменения количества пустого пространства.
  • -W Игнорировать все пустое пространство.
  • -B Игнорировать изменения, чьи строки все пустые.
  • -s Не выводить общие строки.

Зачастую с файлами журналов вам нужно увеличить ширину столбцов, которые вы можете использовать, -w <num>чтобы сделать экран шире.

другие инструменты, которые я использую время от времени

Diffc

Diffc - это скрипт на python, который раскрашивает унифицированный вывод diff.

$ diffc [OPTION] FILE1 FILE2

             ss of diffc

vimdiff

Vimdiff , вероятно, так же хорош, если не лучше, чем meld, и его можно запускать из терминала. Я всегда забываю использовать его, хотя, по-моему, это хороший показатель того, что я нахожу этот инструмент слишком сложным для повседневного использования. Но YMMV.

                                    сс вимдифф

SLM
источник
1
Одной из замечательных особенностей Meld, к сожалению, не видных на вашем скриншоте, является подсветка синтаксиса файлов исходного кода.
manatwork
Да. Я все время использовал vimdiff, с тех пор я перешел на использование meld, я нахожу его проще и проще увидеть, что он говорит мне против vimdiff.
slm
@manatwork - добавил свою ссылку в ответ, спасибо за отзыв!
slm
1
Прекрасно выглядит для исходного кода, но не для сравнения файлов журналов. Я часто использую colordiffиз colordiff.org для исходного файла. Насколько я понимаю, sdiffпохоже на diff -yбез различий в выводе, но немного другие варианты. +1 за показ некоторых хороших альтернатив простой diff.
Лекенштейн
Я никогда не использовал colordiff, я должен это проверить. Вы правы на diff -y. Добавление этого переключателя в, diffкажется, произошло в какой-то момент, или я никогда не замечал этого. Кроме того, здесь есть ссылка на страницу ресурса инструментов GNU diff . Хорошие вещи для использования этого набора инструментов.
SLM
20

В настоящее время я использую параллельный diff с grep-фильтрацией различных строк:

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • Опция -W250делает вывод шире, так что я могу видеть больше данных.
  • expand необходимо конвертировать вкладки в пробелы
  • -C3 добавляет 3 строки контекста к выводу grep.
  • ^.{123} соответствует половине данных перед соседними маркерами diff.
  • colordiff делает вывод красивее, чтобы следовать
  • less -rSпозволяет интерпретировать цвета ANSI ( -r) и предотвращает перенос строк ( -S).

Это взлом, альтернативы приветствуются.

Lekensteyn
источник
1
Это замечательно.
Пэт Майрон
Хорошая идея. К сожалению, grepрегулярное выражение слишком медленное. Также diffесть -tвозможность расширить вкладки.
Тимммм
12

Никто еще не упомянул icdiff ? Здорово! Пик говорит сам за себя: icdiff

Радек Постолович
источник
Это очень аккуратный инструмент, также доступный на aur.
Узумаки Д. Ичиго,
Слишком медленно для больших файлов.
Тимммм
0

Команда linux "sdiff" показывает параллельные различия, по умолчанию включающие все строки, но вы можете использовать различные опции, чтобы показать только различия:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

где

-t: переводить табуляцию в пробелы

-W: игнорировать пробельные различия

-B: игнорировать пустые строки

-s: игнорировать одинаковые строки

-w $ COLUMNS: использовать полную ширину экрана

Показанные строки будут разделены на |, <или> - см. Документацию или просто попробуйте.

Моше Юдковский
источник