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

UnixForum





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

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

Оригинал: How to do line-by-line comparison of files in Linux using diff command
Автор: Himanshu Arora
Дата публикации: 27 декабря 2016 г.
Перевод: А.Панин
Дата перевода: 9 февраля 2017 г.

Если вы являетесь пользователем Linux и в ваши обязанности входит работа с различными дистрибутивами, вы наверняка нередко используете терминал для исполнения тех или иных команд. Обычно в подобных ситуациях у пользователя нет доступа к наиболее удобным и привычным инструментам с графическим интерфейсом, таким, как текстовый редактор GEdit, позволяющий без труда редактировать текстовые файлы.

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

Для сравнения текстовых файлов в Linux может использоваться утилита diff, главным недостатком которой является высокий порог вхождения. Если вы не знакомы с принципом работы diff и ищите руководство по ее использованию, вы пришли по правильному адресу, ведь в рамках данной статьи мы будем обсуждать основные приемы использования данной утилиты на основе простых и понятных примеров.

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

Утилита diff в Linux

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

diff [ПАРАМЕТРЫ] ... ФАЙЛЫ

Элемент [ПАРАМЕТРЫ] соответствует различным параметрам утилиты, а элемент ФАЙЛЫ - паре имен текстовых файлов. Несмотря на то, что страница руководства утилиты diff содержит полезную информацию, полная документация утилиты diff содержится в руководстве формата Texinfo. В том случае, если утилиты info и diff были корректно установлены в вашу систему, команда

info diff

позволит вам получить доступ к полному руководству по использованию diff.

Примеры использования утилиты diff

Теперь давайте рассмотрим вопрос использования утилиты diff. Начнем с самого простого примера. Предположим, что нам нужно сравнить два текстовых файла со следующим содержимым:

Файл file1:

test
test2
test3

Файл file2:

test
test23
test3

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

diff file1 file2

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

2c2
< test2
---
> test23

Вывод является неочевидным, не так ли? Не беспокойтесь, мы скоро разберемся с его содержимым. Но в первую очередь давайте рассмотрим базовую структуру вывода, генерируемого утилитой diff.

Первая особенность, о которой следует помнить, заключается в том, что вывод утилиты представляет изменения, необходимые для преобразования файла с именем file1 (обычно оригинального файла) в файл с именем file2 (новый или модифицированный файл). Вывод обычно состоит из строки с числовым значением (или диапазоном значений), после которого идет буквенный символ (a, d или c) и еще одно числовое значение (или диапазон значений). Например, 2c2 (как в приведенном выше выводе).

Первое числовое значение соответствует номеру строки (или диапазону номеров строк) из файла с именем file1 (оригинального файла), а последнее значение - номеру строки (или диапазону номеров строк) из файла с именем file2 (нового файла). В качестве буквенного символа может использоваться символ a, указывающий на то, что данные должны быть добавлены, символ d, указывающий на то, что данные должны быть удалены, а также символ c, указывающий на то, что данные должны быть изменены.

Таким образом, строки 2c2 говорит о том, что вторая строка оригинального файла была модифицирована и должна быть заменена на вторую строку из нового файла для того, чтобы файлы стали идентичными. Если вы сравните два файла вручную (file1 и file2) вы сможете самостоятельно убедиться в справедливости данного утверждения.

В случае строк, следующих после строки 2c2 в приведенном выше примере, все гораздо проще: строка, начинающаяся с символа < содержит ничто иное, как вторую строку из файла с именем file1, а строка, начинающаяся с символа > - ничто иное, как интересующую нас строку из файла с именем file2. Строка с тремя дефисами (---) используется исключительно для разделения описанных выше строк.

Требуется ли говорить что-либо еще о выводе из первого примера? Скорее всего нет, так как приведенное выше описание данного вывода является исчерпывающим. Теперь давайте рассмотрим еще один пример.

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

Привет,
Это руководство по использованию утилиты diff
от ресурса HowtoForge.
Надеюсь, оно будет полезным для вас.
Благодарю за внимание.

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

Привет,
Добро пожаловать на ресурс HowtoForge.
В рамках этого руководства описываются приемы использования утилиты diff.
Надеюсь, оно содержит полезную для вас информацию.
Благодарю за внимание.

Это команда сравнения файлов (которая остается одной и той же):

diff file1 file2

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

2,4c2,4
< Это руководство по использованию утилиты diff
< от ресурса HowtoForge.
< Надеюсь, оно будет полезным для вас.
---
> Добро пожаловать на ресурс HowtoForge.
> В рамках этого руководства описываются приемы использования утилиты diff.
> Надеюсь, оно содержит полезную для вас информацию.

Как несложно заметить, в данном случае первая строка вывода 2,4c2,4 содержит множество числовых значений до и после буквенного символа. По сути, это диапазоны: 2,4 представляет строки под номерами 2, 3 и 4. Таким образом, данный вывод обозначает, что строки с номерами от 2 до 4 из оригинального файла (file1) должны быть заменены на строки с номерами от 2 до 4 из нового файла (file2) для того, чтобы файлы стали идентичными.

Теперь давайте немного изменим содержимое наших файлов. Не будем трогать файл с именем file1, а файл file2 модифицируем следующим образом:

Добро пожаловать на ресурс HowtoForge.
В рамках этого руководства описываются приемы использования утилиты diff.
Надеюсь, оно содержит полезную для вас информацию.
Благодарю за внимание.

Привет,
Это руководство по использованию утилиты diff
от ресурса HowtoForge.
Надеюсь, оно будет полезным для вас.
Благодарю за внимание.

Теперь после исполнения команды diff вы получите следующий вывод:

0a1,5
> Добро пожаловать на ресурс HowtoForge.
> В рамках этого руководства описываются приемы использования утилиты diff.
> Надеюсь, оно содержит полезную для вас информацию.
> Благодарю за внимание.
> 

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

А если вы удалите последнюю строку («Благодарю за внимание.») из файла с именем file2, вывод утилиты приобретет следующий вид:

0a1,5
> Добро пожаловать на ресурс HowtoForge.
> В рамках этого руководства описываются приемы использования утилиты diff.
> Надеюсь, оно содержит полезную для вас информацию.
> Благодарю за внимание.
> 
5d9
< Благодарю за внимание.

Как несложно заметить, вывод также содержит строку 5d9, обозначающую, что пятая строка из файла с именем file1 должна быть удалена для того, чтобы файлы стали идентичными начиная со строки номер 9. Конечно же, эта операция должна осуществляться после операции с обозначением 0a1,5, которая была описана выше.

Заключение

Сложно не согласиться с тем утверждением, что утилита diff не является простой в плане освоения, но и порог вхождения не является крайне высоким. Потратьте несколько часов на эксперименты с данным инструментом и вы наверняка научитесь с ним работать. Что же по поводу данного руководства, мы затронули лишь самые общие вопросы. Ознакомьтесь со страницей руководства diff и вы поймете, что о данном инструменте можно говорить еще очень долго, поэтому мы обсудим некоторые его возможности в следующей статье серии.

Вторая часть статьи: "Параметры командной строки утилиты diff"..