Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Построчное сравнение трех текстовых файлов в Linux с помощью утилиты diff3

Оригинал: How to compare three files in Linux using diff3 tool
Автор: Himanshu Arora
Дата публикации: 6 января 2017 г.
Перевод: А.Панин
Дата перевода: 14 февраля 2017 г.

В ранее опубликованной серии статей мы уже рассматривали утилиту с интерфейсом командной строки для Linux под названием diff, позволяющую осуществлять построчное сравнение двух текстовых файлов. Но что делать в том случае, если требуется сравнить не два, а три файла? Да, для выполнения этой операции в Linux также имеется утилита с соответствующим названием diff3.

Если вы искали подобный инструмент, вы пришли по правильному адресу, ведь в данной статье мы будем рассматривать методику использования diff3 на основе простых для понимания примеров.

Но перед тем, как перейти к рассмотрению возможностей утилиты, следует упомянуть о том, что все приведенные в данной статье примеры были протестированы в системе Ubuntu 14.04 с Bash версии 4.3.11(1) и diff3 версии 3.3.

Установка diff3

Инструмент diff3, вероятнее всего, уже имеется в вашей системе, по крайней мере в том случае, если вы используете Ubuntu. Но даже если это не так, не стоит огорчаться, ведь вы всегда можете установить его путем установки пакета программного обеспечения с компонентами проекта GNU Diffutils. Если вас интересует подробное описание процесса загрузки и установки этого пакета в вашу систему, вы можете перейти по данной ссылке.

Использование diff3

Так как утилита diff3 предназначена для сравнения трех файлов, для демонстрации ее возможностей нам придется создать три текстовых файла, которые, по сути, и будут сравниваться.

Это содержимое файла с именем file1:

Это строка 1 с небольшим изменением
Это строка 2
Это строка 3

Это содержимое файла с именем file2:

Это строка 1
Это строка 2
Это строка 3

А это содержимое файла с именем file3:

Это строка 1
Это строка 2
Это строка 3

При рассмотрении содержимого этих трех файлов несложно заметить единственное отличие в первой строке первого файла. А теперь давайте посмотрим, как diff3 сообщит нам о нем.

Это пример использования утилиты diff3 для сравнения наших файлов:

diff3 file1 file2 file3

А это вывод, сгенерированный данной утилитой:

====1
1:1c
  Это строка 1 с небольшим изменением
2:1c
3:1c
  Это строка 1

Вы можете интерпретировать данный вывод следующим образом:

  • Первая строка, начинающаяся с четырех символов равенства ("=") и заканчивающаяся числом "1", сообщает о наличии изменения в первом файле.
  • В следующей строке первый символ "1" обозначает первый файл с именем file1; последовательность символов "1c" после символа двоеточия (":") расшифровывается как "первая строка содержит" ("first line contains"). Само содержимое этой строки находится в следующей строке вывода.
  • По аналогии, последовательности символов "2:1c" и "3:1c" обозначают, что первые строки файлов с именами file2 и file3 содержат отличающуюся информацию. А ввиду того, что содержимое этих строк двух упомянутых файлов идентично, оно выводится однократно в конце.

Для того, чтобы дополнительно прояснить ситуацию, предлагаю рассмотреть еще один пример, в котором модификации подвергается строка из файла с именем file3.

Это содержимое файла с именем file1:

Это строка 1
Это строка 2
Это строка 3

Это содержимое файла с именем file2:

Это строка 1
Это строка 2
Это строка 3

А это содержимое файла с именем file3:

Это строка 1 с небольшим изменением
Это строка 2
Это строка 3

Команда для сравнения остается неизменной:

diff3 file1 file2 file3

А это вывод утилиты:

====3
1:1c
2:1c
  Это строка 1
3:1c
  Это строка 1 с небольшим изменением

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

  • Изменению подвергся файл с именем file3.
  • Первой строкой файлов с именами file1 и file2 является строка "Это строка 1".
  • В то же время, файл с именем file3 содержит первую строку "Это строка 1 с небольшим изменением".

И это все, что следовало бы сказать о формате сообщений об изменениях строк текстовых файлов утилиты diff3. Теперь давайте разберемся с тем, как утилита diff3 будет вести себя при наличии в одном из файлов дополнительной строки.

Оставим содержимое файлов с именами file1 и file2 прежним, приведя содержимое файла с именем file3 к следующему виду:

Это строка 1
Это строка 2
Это строка 3
Это строка 4

Очевидно, что файл с именем file3 теперь содержит дополнительную строку в конце.

Давайте воспользуемся уже известной нам командой для сравнения содержимого этих файлов:

diff3 file1 file2 file3

А это вывод, генерируемый утилитой в данном случае:

====3
1:3a
2:3a
3:4c
  Это строка 4

Вывод начинается с сообщения о том, что изменение находится в файле с именем file3. При этом оно находится в четвертой строке этого файла ("3:4c"), а сама эта строка является новой и отсутствует в файлах с именами file1 и file2.

До текущего момента мы обсуждали достаточно очевидные случаи использования рассматриваемой утилиты. Предлагаю обсудить несколько более сложных ситуаций. Например, предположим, что файлы с именами file1, file2 и file3 содержат следующие строки.

Это содержимое файла с именем file1:

Это строка 1
Это строка 2 с небольшим изменением
Это строка 3

Это содержимое файла с именем file2:

Это строка 1
Это строка 2
Это строка 3

А это содержимое файла с именем file3:

Это строка 1
Это строка 2
Это строка 3 с небольшим изменением

Итак, теперь файлы с именами file1 и file3 содержат изменения в различных строках. Давайте рассмотрим вывод утилиты diff3 в данном случае:

====
1:2,3c
  Это строка 2 с небольшим изменением
  Это строка 3
2:2,3c
  Это строка 2
  Это строка 3
3:2,3c
  Это строка 2
  Это строка 3 с небольшим изменением

Как несложно заметить при рассмотрении приведенного выше вывода, первая строка не содержит какого-либо числового значения. Это объясняется тем, что измененные строки теперь содержатся не в одном, а сразу в нескольких файлах. Для утилиты diff3 строки 2 и 3 всех трех файлов теперь являются различными. По этой причине после символа двоеточия (":") вместо одного находятся два числовых значения, например, "2,3", что означает "со строки 2 по строку 3".

Давайте рассмотрим еще один пример. Предположим, что текстовые файлы содержат следующую информацию.

Это содержимое файла с именем file1:

Это строка 1
Это строка 2
Это строка 3
Это строка 4

Это содержимое файла с именем file2:

Это строка 1
Это строка 2
Это строка 3

А это содержимое файла с именем file3:

Это строка 1
Это строка 2
Это строка 3
Это строка 4
Это строка 5

Теперь после запуска утилиты diff3 будет сгенерирован следующий вывод:

====
1:4c
  Это строка 4
2:3a
3:4,5c
  Это строка 4
  Это строка 5

Если вы попытаетесь разобраться с данным выводом, вы без труда поймете, что утилита diff3 сообщает об изменениях после строки 3 во всех трех файлах. Файл с именем file1 содержит дополнительную четвертую строку "Это строка 4", а файл с именем file3 - дополнительные четвертую и пятую строки "Это строка 4" и "Это строка 5" соответственно. С другой стороны, файл с именем file2 содержит лишь три строки.

На этом описание основных приемов работы с утилитой diff3 можно считать исчерпанным. Вывод о потенциале данного инструмента может быть сделан на основе описания его возможностей из официальной документации: "Вы можете использовать утилиту diff3 для получения информации об отличиях трех файлов. Если несколько людей независимо друг от друга внесли свои правки в один и тот же файл, diff3 создаст отчет с описанием различий между оригинальным файлом и его двумя модифицированными версиями, а также при необходимости объединит изменения в рамках результирующего файла, содержащего внесенные этими людьми изменения, а также предупреждениями о возникших конфликтах.".

Заключение

В данной статье мы затронули лишь некоторые из возможностей утилиты diff3, но на самом деле она способна на гораздо большее. Например, в официальной документации данной утилиты говорится, в том числе о том, что вы можете использовать ее для объединения изменений из нескольких файлов в рамках одного файла. Кроме того, она поддерживает множество параметров командной строки, которые позволяют повлиять на формат ее вывода, а также получить доступ к ее дополнительным функциям. Все параметры и функции данной утилиты описаны на странице руководства, с содержанием которой вам также стоит ознакомиться.