- Построчное сравнение текстовых файлов в Linux с помощью утилиты diff — часть 2
- Параметры командной строки утилиты diff
- 1. Вывод сообщения об идентичности файлов
- 2. Копируемый и унифицированный контексты вывода
- 3. Вывод сценария для текстового редактора ed
- 4. Генерация вывода в двух столбцах
- 5. Сокрытие идентичных строк
- 6. Вывод имен функций языка C, содержащих измененный код
- 7. Рекурсивное сравнение содержимого поддиректорий
- 8. Обработка отсутствующих файлов как пустых
- Заключение
- Построчное сравнение текстовых файлов в Linux с помощью утилиты diff — часть 1
- Утилита diff в Linux
- Примеры использования утилиты diff
- Заключение
- Команда Diff в Linux
- Как использовать команду diff
- Нормальный формат
- Формат контекста
- Единый формат
- Игнорировать регистр
- Выводы
Построчное сравнение текстовых файлов в Linux с помощью утилиты diff — часть 2
Оригинал: How to do line-by-line comparison of files in Linux using diff command — Part II
Автор: Himanshu Arora
Дата публикации: 2 января 2017 г.
Перевод: А.Панин
Дата перевода: 13 февраля 2017 г.
В первой статье серии мы обсудили основные вопросы, связанные с использованием утилиты diff, включая принцип ее работы, а также методику разбора ее вывода. Хотя данная утилита с интерфейсом командной строки и предполагает высокий уровень вхождения, вам стоит научиться работать с ней, особенно в том случае, если ваша повседневная работа связана с обработкой файлов на машинах, работающих под управлением Linux без графического интерфейса.
Предполагая, что вы уже умеете работать с утилитой diff, в данной статье я предлагаю обсудить различные параметры командной строки этой утилиты на основе простых для понимания примеров.
Но перед тем, как перейти к рассмотрению параметров командной строки утилиты, следует упомянуть о том, что все примеры из данной статьи были протестированы в системе Ubuntu 14.04 с Bash версии 4.3.11(1) и diff версии 3.3.
Параметры командной строки утилиты diff
1. Вывод сообщения об идентичности файлов
По умолчанию в случае установления факта идентичности файлов утилита diff не выводит никаких сообщений.
Но существует специальный параметр командной строки ( -s ), в случае использования которого данная утилита будет сообщать об идентичности файлов:
2. Копируемый и унифицированный контексты вывода
Утилита diff поддерживает, по сути, два различных формата вывода. Копируемый контекст вывода (copied context) активируется с помощью параметра командной строки -c , а унифицированный контекст (unified context) — с помощью параметра командной строки -u . Это пример первого первого формата вывода:
Очевидно, что в случае использования копируемого контекста вывода отличающиеся строки маркируются с помощью символа восклицательного знака ( «!» ).
А это пример унифицированного контекста вывода:
В случае использования этого формата вывода символы «+» и «-» перед строками соответствуют различиям в файлах: с помощью символа «-» маркируются строки из файла с именем file1, отсутствующие в файле с именем file2, а с помощью символа «+» — строки из файла с именем file2, которые должны быть добавлены в файл с именем file1.
3. Вывод сценария для текстового редактора ed
Утилита diff также может выводить последовательности команд, которые, в свою очередь, могут использоваться текстовым редактором ed для преобразования оригинального файла (в наших примерах с именем file1) в новый файл (с именем file2). Вы можете получить такой вывод следующим образом.
Предположим, что файлы с именами file1 и file2 имеют следующие различия:
Теперь используем параметр командной строки -e для генерации вывода, понятного текстовому редактору ed , после чего перенаправим этот вывод в отдельный файл:
В данном случае в файле будет сохранен следующий вывод утилиты:
После этого вам придется самостоятельно добавить команду «w» в конец этого файла:
Теперь вы можете выполнить следующую команду:
В результате файлы с именами file1 и file2 станут идентичными:
Если вас интересует дополнительная информация, связанная с данной функцией утилиты, вы можете перейти по этой ссылке .
4. Генерация вывода в двух столбцах
Обычно diff генерирует вывод следующего формата:
Но существует специальный параметр командной строки ( -y ), который сообщает утилите о необходимости вывода данных в двух отдельных столбцах. А это пример такого вывода:
Очевидно, что при использовании данного формата вывода символ «|» используется для маркировки отличающихся строк.
5. Сокрытие идентичных строк
Если вы внимательно рассмотрите вывод из предыдущего примера (из расположенного выше раздела 4), вы обнаружите, что при использовании параметра командной строки -y утилита diff выводит не только измененные, но и идентичные строки обрабатываемых файлов. В том случае, если вам нужно убрать идентичные строки из вывода, вы можете воспользоваться параметром —suppress-common-lines .
6. Вывод имен функций языка C, содержащих измененный код
При использовании утилиты diff для сравнения двух файлов исходного кода на языке C может использоваться специальный параметр ( -p ), который сообщает утилите о необходимости вывода имен функций, в коде которых были обнаружены изменения. Например, предположим, что требуется сравнить два следующих файла исходного кода на языке C:
Файл с именем file1.c:
Файл с именем file2:
Это результат обычного сравнения этих файлов:
А это результат сравнения тех же файлов с использованием параметра -p :
Очевидно, что в случае использования параметра командной строки -p diff генерирует более подробный вывод с маркировкой измененных строк с помощью символа восклицательного знака ( «!» ).
7. Рекурсивное сравнение содержимого поддиректорий
Утилита diff также позволяет осуществлять рекурсивное сравнение содержимого поддиректорий, но этот режим работы не активирован по умолчанию. Я подразумевал, что при использовании данной команды:
утилита diff будет осуществлять сравнение лишь файлов из директорий верхнего уровня, но в случае использования параметра -r (активирующего режим рекурсивного сравнения файлов) будет осуществляться сравнение даже тех файлов, которые находятся в поддиректориях:
8. Обработка отсутствующих файлов как пустых
Утилита diff также поддерживает параметр, с помощью которого вы можете сообщить ей о том, что следует рассматривать отсутствующие файлы как пустые. Если вы сравните файлы с именами file1 и file3 (причем последнего файла не существует), по умолчанию diff выведет сообщение об ошибке:
В этом нет ничего плохого; по сути, данное поведение является вполне обоснованным. Но бывают случаи, когда необходимо избежать вывода сообщений об ошибках (возможно, при использовании diff в рамках сценариев командной оболочки), в которых вы можете воспользоваться параметром -N для обработки отсутствующих файлов как пустых и продолжения сравнения файлов.
Заключение
Если вы внимательно прочитали обе статьи серии и самостоятельно повторили все рассмотренные в них примеры команд, то вполне можно сказать, что вы овладели всеми основными навыками работы с рассматриваемой утилитой. Конечно же, мы не смогли бы обсудить все связанные с diff вопросы в рамках нескольких статей, но все же все основные возможности и функции данной утилиты были так или иначе упомянуты в них.
Если вы хотите узнать немого больше о данной утилите, вы всегда можете обратиться к ее странице руководства . Думаю, не стоит лишний раз упоминать о том, что вы должны периодически использовать утилиту с различными наборами параметров для симуляции различных рабочих ситуаций.
Источник
Построчное сравнение текстовых файлов в 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 содержится в руководстве формата Texinfo. В том случае, если утилиты info и diff были корректно установлены в вашу систему, команда
позволит вам получить доступ к полному руководству по использованию diff.
Примеры использования утилиты diff
Теперь давайте рассмотрим вопрос использования утилиты diff. Начнем с самого простого примера. Предположим, что нам нужно сравнить два текстовых файла со следующим содержимым:
Вы можете использовать следующую команду для сравнения этих файлов:
А это вывод, который будет сгенерирован после исполнения данной команды:
Вывод является неочевидным, не так ли? Не беспокойтесь, мы скоро разберемся с его содержимым. Но в первую очередь давайте рассмотрим базовую структуру вывода, генерируемого утилитой diff.
Первая особенность, о которой следует помнить, заключается в том, что вывод утилиты представляет изменения, необходимые для преобразования файла с именем file1 (обычно оригинального файла) в файл с именем file2 (новый или модифицированный файл). Вывод обычно состоит из строки с числовым значением (или диапазоном значений), после которого идет буквенный символ (a, d или c) и еще одно числовое значение (или диапазон значений). Например, 2c2 (как в приведенном выше выводе).
Первое числовое значение соответствует номеру строки (или диапазону номеров строк) из файла с именем file1 (оригинального файла), а последнее значение — номеру строки (или диапазону номеров строк) из файла с именем file2 (нового файла). В качестве буквенного символа может использоваться символ a , указывающий на то, что данные должны быть добавлены, символ d , указывающий на то, что данные должны быть удалены, а также символ c , указывающий на то, что данные должны быть изменены.
Таким образом, строки 2c2 говорит о том, что вторая строка оригинального файла была модифицирована и должна быть заменена на вторую строку из нового файла для того, чтобы файлы стали идентичными. Если вы сравните два файла вручную (file1 и file2) вы сможете самостоятельно убедиться в справедливости данного утверждения.
В случае строк, следующих после строки 2c2 в приведенном выше примере, все гораздо проще: строка, начинающаяся с символа содержит ничто иное, как вторую строку из файла с именем file1, а строка, начинающаяся с символа > — ничто иное, как интересующую нас строку из файла с именем file2. Строка с тремя дефисами ( — ) используется исключительно для разделения описанных выше строк.
Требуется ли говорить что-либо еще о выводе из первого примера? Скорее всего нет, так как приведенное выше описание данного вывода является исчерпывающим. Теперь давайте рассмотрим еще один пример.
Это содержимое файла file1:
Это содержимое файла file2:
Это команда сравнения файлов (которая остается одной и той же):
А это вывод, сгенерированный в результате ее исполнения:
Как несложно заметить, в данном случае первая строка вывода 2,4c2,4 содержит множество числовых значений до и после буквенного символа. По сути, это диапазоны: 2,4 представляет строки под номерами 2, 3 и 4. Таким образом, данный вывод обозначает, что строки с номерами от 2 до 4 из оригинального файла (file1) должны быть заменены на строки с номерами от 2 до 4 из нового файла (file2) для того, чтобы файлы стали идентичными.
Теперь давайте немного изменим содержимое наших файлов. Не будем трогать файл с именем file1, а файл file2 модифицируем следующим образом:
Теперь после исполнения команды diff вы получите следующий вывод:
Очевидно, что утилита сразу же установила тот факт, что второй параграф файла с именем file2 является ничем иным, как содержимым файла file1. Таким образом, в выводе содержится информация о том, что для достижения идентичности двух файлов достаточно добавить в начало файла с именем file1 с 1 по 5 строки из файла с именем file2.
А если вы удалите последнюю строку («Благодарю за внимание.») из файла с именем file2, вывод утилиты приобретет следующий вид:
Как несложно заметить, вывод также содержит строку 5d9, обозначающую, что пятая строка из файла с именем file1 должна быть удалена для того, чтобы файлы стали идентичными начиная со строки номер 9. Конечно же, эта операция должна осуществляться после операции с обозначением 0a1,5, которая была описана выше.
Заключение
Сложно не согласиться с тем утверждением, что утилита diff не является простой в плане освоения, но и порог вхождения не является крайне высоким. Потратьте несколько часов на эксперименты с данным инструментом и вы наверняка научитесь с ним работать. Что же по поводу данного руководства, мы затронули лишь самые общие вопросы. Ознакомьтесь со страницей руководства diff и вы поймете, что о данном инструменте можно говорить еще очень долго, поэтому мы обсудим некоторые его возможности в следующей статье серии.
Источник
Команда Diff в Linux
diff — это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.
Команда diff обычно используется для создания патча, содержащего различия между одним или несколькими файлами, которые можно применить с помощью команды patch .
Как использовать команду diff
Синтаксис команды diff следующий:
Команда diff может отображать вывод в нескольких форматах, наиболее распространенными из которых являются обычный, контекстный и унифицированный формат. Вывод включает информацию о том, какие строки в файлах необходимо изменить, чтобы они стали идентичными. Если файлы совпадают, вывод не производится.
Чтобы сохранить вывод команды в файл, используйте оператор перенаправления:
В этой статье мы будем использовать следующие два файла, чтобы объяснить, как работает команда diff :
Нормальный формат
В простейшей форме, когда команда diff запускается для двух текстовых файлов без каких-либо параметров, она производит вывод в нормальном формате:
Результат будет выглядеть примерно так:
Обычный выходной формат состоит из одного или нескольких разделов, в которых описываются различия. Каждый раздел выглядит так:
0a1 , 2d2 и 4c4,5 — это команды изменения. Каждая команда изменения содержит следующее слева направо:
- Номер строки или диапазон строк в первом файле.
- Особый символ изменения.
- Номер строки или диапазон строк во втором файле.
Символ изменения может быть одним из следующих:
- a — Добавьте линии.
- c — Измените линии.
- d — Удалить строки.
За командой изменения следуют полные строки, которые удаляются ( ) и добавляются в файл ( > ).
- 0a1 — добавить строку 1 второго файла в начало file1 (после строки 0 ).
- > Kubuntu — Строка из второй строки, которая добавляется в первый файл, как описано выше.
- 2d2 — Удалить строку 2 в первом файле. 2 после символа d означает, что если строку не удалить, она появится на строке 2 второго файла.
- — удаленная строка.
- 4c4,5 — Заменить (изменить) строку 5 в первом файле на строки 4-5 из второго файла.
- — строка в первом заменяемом файле.
- — — Разделитель.
- > Arch Linux и > Centos — Строки из второго файла, заменяющие строку в первом файле.
Формат контекста
Когда используется формат вывода контекста, команда diff отображает несколько строк контекста вокруг строк, которые различаются между файлами.
Параметр -c указывает diff выводить вывод в контекстном формате:
Вывод начинается с имен и меток времени сравниваемых файлов, а также с одного или нескольких разделов, описывающих различия. Каждый раздел выглядит так:
- from-file-line-numbers и to-file-line-numbers — Номера строк или разделенный запятыми диапазон строк в первом и втором файле, соответственно.
- from-file-line и to-file-line — Строки, которые различаются, и строки контекста:
- Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
- Строки, начинающиеся со знака минуса ( — ), — это строки, которые ничего не соответствуют во втором файле. Во втором файле отсутствуют строки.
- Строки, начинающиеся с символа плюса ( + ), — это строки, которые ничего не соответствуют в первом файле. В первом файле отсутствуют строки.
- Строки, начинающиеся с восклицательного знака ( ! ), — это строки, которые меняются между двумя файлами. Каждая группа строк, начинающаяся с ! из первого файла имеет соответствующее совпадение во втором файле.
Давайте объясним наиболее важные части вывода:
- В этом примере у нас есть только один раздел, описывающий различия.
- *** 1,6 **** и — 1,7 —- сообщает нам диапазон строк из первого и второго файлов, которые включены в этот раздел.
- Строки Ubuntu , Debian , Fedora и последняя пустая строка в обоих файлах одинаковы. Эти строки начинаются с двойного пробела.
- Строка — Arch Linux из первого файла ничего не соответствует во втором файле. Хотя эта строка также существует во втором файле, позиции другие.
- Строка + Kubuntu из второго файла ничего не соответствует в первом файле.
- Линия ! CentOS из первого файла и строк ! Arch Linux и ! CentOS из второго файла меняются между файлами.
По умолчанию количество контекстных строк по умолчанию равно трем. Чтобы указать другой номер, используйте параметр -C ( —contexts ):
Единый формат
Унифицированный выходной формат — это улучшенная версия контекстного формата, обеспечивающая меньший размер вывода.
Используйте параметр -u чтобы указать diff для печати вывода в едином формате:
Вывод начинается с имен и отметок времени файлов и одного или нескольких разделов, описывающих различия. Каждый раздел имеет следующую форму:
- @@ from-file-line-numbers to-file-line-numbers @@ — Номер строки или диапазон строк из первого и второго файлов, включенных в этот раздел.
- line-from-files — строки, которые отличаются и строки контекста:
- Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
- Строки, начинающиеся с символа минуса ( — ), — это строки, которые удаляются из первого файла.
- Строки, начинающиеся с символа плюса ( + ), — это строки, добавленные из первого файла.
Игнорировать регистр
Как вы могли заметить в приведенных выше примерах, команда diff по умолчанию чувствительна к регистру.
Используйте параметр -i чтобы указать diff игнорировать регистр:
Выводы
Сравнение текстовых файлов на предмет различий — одна из самых распространенных задач системных администраторов Linux.
Команда diff сравнивает файлы построчно. Для получения дополнительной информации введите в терминале man diff .
Если у вас есть вопросы, оставьте комментарий ниже.
Источник