Библиотека сайта 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, но на самом деле она способна на гораздо большее. Например, в официальной документации данной утилиты говорится, в том числе о том, что вы можете использовать ее для объединения изменений из нескольких файлов в рамках одного файла. Кроме того, она поддерживает множество параметров командной строки, которые позволяют повлиять на формат ее вывода, а также получить доступ к ее дополнительным функциям. Все параметры и функции данной утилиты описаны на