Меню

Сравнение файлов по содержимому unix



Сравнение файлов по содержимому unix

Существует несколько утилит для сравнения содержимого файлов различными способами. Эти инструменты особенно полезны для сравнения текста в файлах.

Используйте cmp, чтобы определить, различаются ли два текстовых файла. В качестве аргумента укажите два имени файла, и, если файлы содержат одинаковые данные, cmp не вернет результата. Если же файлы различаются, cmp выводит позицию и номер строки в файлах, в которых обнаружены различия.

Чтобы определить, в чем различаются файлы `master’ и `backup’, наберите:

$ cmp master backup [Enter]

Чтобы сравнить два файла и получить отчет о различиях в них, используйте утилиту diff. Отчет о различиях форматируется таким образом, чтобы другие утилиты (например, patch) могли использовать его, чтобы сделать сравниваемые файлы идентичными. В качестве аргументов для diff нужно указать имена сравниваемых файлов.

Чтобы сравнить файлы `manuscript.old’ и `manuscript.new’, введите:

$ diff manuscript.old manuscript.new [Enter]

Отчет о различиях выводится в файл стандартного вывода; чтобы сохранить его в файл на диске, перенаправьте вывод в файл:

$ diff manuscript.old manuscript.new > manuscript.diff [Enter]

В этом случае отчет будет сохранен в файле `manuscript.diff’.

Чтобы нагляднее увидеть различия в двух файлах, используйте команду sdiff; вместо генерации отчета о различиях, она выводит файлы в две колонки, разделяемые пробелами. Различающиеся строки разделяются `|’; строки, встречающиеся только в первом файле, заканчиваются ` ‘.

Чтобы сравнить файлы `laurel’ и `hardy’ на экране, введите:

$ sdiff laurel hardy less [Enter]|

Для одновременного сравнения трех файлов используйте diff3.

Чтобы вывести отчет о различиях между файлами `larry’, `curly’, и `moe’ в файл `stooges’, введите:

Источник

Построчное сравнение текстовых файлов в 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 , указывающий на то, что данные должны быть изменены.

Читайте также:  Mysql сравнение строки с

Таким образом, строки 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 и вы поймете, что о данном инструменте можно говорить еще очень долго, поэтому мы обсудим некоторые его возможности в следующей статье серии.

Источник

Сравнение файлов в консоли Linux

Нужно увидеть различия между двумя ревизиями текстового файла? Тогда diff — это команда, которая вам нужна. Из этого туториала вы узнаете, как легко использовать diff в Linux и macOS.

Погружение в diff

Команда diff сравнивает два файла и выдает список различий между ними. Чтобы быть более точным, он создает список изменений, которые необходимо внести в первый файл, чтобы он соответствовал второму файлу. Если вы будете иметь это в виду, вам будет легче понять вывод diff. Команда diff была разработана для поиска различий между файлами исходного кода и для вывода результатов, которые могут быть прочитаны и обработаны другими программами, такими как команда patch . В этом уроке мы рассмотрим наиболее полезные способы использования diff .

Давайте углубимся и проанализируем два файла. Порядок файлов в командной строке определяет, какой файл diff считает «первым файлом», а какой — «вторым файлом». В приведенном ниже примере alpha1 — это первый файл, а alpha2 — второй файл. Оба файла содержат фонетический алфавит, но второй файл, alpha2, подвергся некоторому дальнейшему редактированию, так что эти два файла не идентичны.

Мы можем сравнить файлы с этой командой. Введите diff, пробел, имя первого файла, пробел, имя второго файла и нажмите клавишу ВВОД.

Как мы анализируем этот результат? Если вы знаете, что искать, это не так уж плохо. Каждое различие перечисляется по очереди в одном столбце, и каждое различие помечается. Ярлык содержит цифры по обе стороны от буквы, например 4c4. Первое число — это номер строки в alpha1, а второе — номер строки в alpha2. Буква в середине может быть:

  • c: Строка в первом файле должна быть изменена, чтобы соответствовать строке во втором файле.
  • d: строка в первом файле должна быть удалена, чтобы соответствовать второму файлу.
  • a: Дополнительный контент должен быть добавлен в первый файл, чтобы он соответствовал второму файлу.
Читайте также:  Сравнение лодок пвх с надувным дном

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

Строки, начинающиеся с ссылаются на второй файл, alpha2. Строка Dave говорит нам, что слово Dave — это содержимое строки четыре в alpha2. Подводя итог, нам нужно заменить Delta на Dave в четвертой строке в alpha1, чтобы эта строка соответствовала обоим файлам.

Следующее изменение обозначено 12c12 . Применяя ту же логику, это говорит нам о том, что строка 12 в alpha1 содержит слово Lima, а строка 12 в alpha2 содержит слово Linux.

Третье изменение относится к строке, которая была удалена из alpha2. Метка 21d20 расшифровывается как «строка 21 должна быть удалена из первого файла, чтобы синхронизировать оба файла со строки 20 и далее». Строка -s (сообщать об идентичных файлах).

Вы можете использовать опцию -q (краткая), чтобы получить одинаково лаконичное утверждение о двух разных файлах.

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

Альтернативный взгляд

Опция -y (рядом) использует другую компоновку для описания различий в файлах. Часто удобно использовать параметр -W (ширина) с видом рядом, чтобы ограничить количество отображаемых столбцов. Это позволяет избежать появления уродливых строк, которые затрудняют чтение. Здесь мы указали diff производить параллельное отображение и ограничивать вывод до 70 столбцов.

Первый файл в командной строке, alpha1, показан слева, а вторая строка в командной строке, alpha2, показана справа. Строки из каждого файла отображаются рядом. Рядом с этими строками в alpha2 есть символы индикатора, которые были изменены, удалены или добавлены.

  • |: Строка, которая была изменена во втором файле.
  • : Строка, добавленная ко второму файлу, которого нет в первом файле.

Если вы предпочитаете более компактную сводную информацию о различиях в файлах, используйте параметр —suppress-common-lines . Это заставляет diff перечислять только измененные, добавленные или удаленные строки.

Добавьте цветовую подсветку

Другая утилита под названием colordiff добавляет цветовую подсветку к выводу diff. Это позволяет намного легче увидеть, какие линии имеют различия.

Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.

Используйте colordiff же, как вы используете diff .

На самом деле, colordiff — это оболочка для diff, и diff делает всю работу за кулисами. Из-за этого все опции diff будут работать с colordiff.

Предоставление определённого контекста

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

Первый метод использует опцию -c (скопированный контекст).

Вывод diff имеет заголовок. В заголовке перечислены два имени файла и время их изменения. Звездочки (*) перед именем первого файла и тире (-) перед именем второго файла. Звездочки и тире будут использоваться, чтобы указать, какому файлу принадлежат строки в выходных данных.

Линия звездочек с 1,7 в середине указывает на то, что мы смотрим на линии от alpha1. Чтобы быть точным, мы смотрим на строки с первой по седьмую. Слово Delta помечается как измененное. Он имеет восклицательный знак (!) Рядом с ним, и он красный. Есть три строки не измененного текста, отображаемые до и после этой строки, поэтому мы можем видеть контекст этой строки в файле.

Линия штрихов с 1,7 в середине говорит о том, что мы сейчас смотрим на линии из alpha2. Опять же, мы смотрим на строки с первой по седьмую, причем слово Dave на четвертой строке помечено как отличающееся.

Три строки контекста выше и ниже каждого изменения — это значение по умолчанию. Вы можете указать, сколько строк контекста вы хотите предоставить diff . Для этого используйте опцию -C (скопированный контекст) с заглавной буквой «C» и укажите количество строк, которое вам нужно:

Вторая опция diff которая предлагает контекст, это опция -u (унифицированный контекст).

Как и раньше, у нас есть заголовок на выходе. Эти два файла названы, и показано время их изменения. Есть тире (-) перед названием альфа1 и знаки плюс (+) перед названием альфа2. Это говорит нам о том, что тире будут использоваться для обозначения альфа1, а знаки плюс будут использоваться для обозначения альфа2. По всему списку разбросаны строки, начинающиеся со знаков (@). Эти строки отмечают начало каждого различия. Они также говорят нам, какие строки показываются из каждого файла.

Нам показывают три строки до и после строки, помеченной как отличающиеся, чтобы мы могли видеть контекст измененной строки. В едином представлении линии с разницей показаны одна над другой. Перед строкой из alpha1 стоит тире, а перед строкой из alpha2 стоит знак плюс. Это отображение достигает в восьми строках того, что для скопированного контекстного дисплея выше потребовалось пятнадцать.

Читайте также:  Сравнить ттх танков вот блиц

Как и следовало ожидать, мы можем попросить diff точное количество строк унифицированного контекста, которые мы хотели бы видеть. Для этого используйте опцию -U (унифицированный контекст) с заглавной буквой «U» и укажите желаемое количество строк:

Игнорирование пустого пространства

Давайте проанализируем еще два файла, test4 и test5. В них есть имена шести супергероев.

Результаты показывают, что diff находит ничего особенного с линиями Black Widow, Spider-Man и Thor. Он отмечает изменения с линиями Капитан Америка, Железный человек и Халк.

Так что же отличается? Что ж, в тесте 5 Халк пишется строчной буквой «h», а у «Капитана Америка» есть дополнительный пробел между «Капитаном» и «Америкой». Хорошо, это ясно, но что не так с линией Ironman? Там нет видимых различий. Вот хорошее эмпирическое правило. Если вы не видите этого, ответ — пробел. В конце этой строки почти наверняка есть пробел или два, или символ табуляции.

Если они не имеют значения для вас, вы можете diff игнорировать определенные типы различий строк, в том числе:

  • -i: игнорировать различия в случае.
  • -Z: игнорировать конечные пробелы.
  • -b: игнорировать изменения количества пустого пространства.
  • -w: игнорировать все изменения пробелов.

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

Строки с «The Hulk» и «The Hulk» теперь считаются совпадением, и для строчной буквы «h» не отмечается никакой разницы. Давайте попросим diff также игнорировать конечный пробел.

Как и предполагалось, конечный пробел должен был быть различием на линии Ironman, потому что diff больше не помечает разницу для этой линии. Это оставляет Капитана Америку. Давайте попросим diff игнорировать регистр и игнорировать все проблемы с пробелами.

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

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

Источник

Сравнение файлов в Linux (команда diff)

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

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

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

Опции команды diff

Рассмотрим основные опции команды diff. Я рассмотрю только те опции, которые сам использую наиболее часто.

-E игнорировать изменения, связанные с добавлением символа табуляции в тексте.
-b игнорировать изменения, связанные с добавлением пробелов.
-w игнорировать изменения, связанные с добавлением пробелов и табуляции.
-B игнорировать новые пустые строки.
-p (или —show-c-function) показать название функции языка C, в которой найдены изменения.
-y (или —side-by-side) отобразить результаты в две колонки.
-r просматривать каталоги рекурсивно.
-X FILE исключить из поиска файлы, имена которых совпадают с шаблонами в файле FILE.
-d (или —minimal) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).

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

Сравнение двух текстовых файлов

Для простого сравнения двух текстовых файлов с именами myfile1 и myfile2 выполним в терминале команду:

Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):

Сравнение директорий, содержащих текстовые файлы

Рассмотрим пример сравнения двух директорий ( mydir1 и mydir2 ), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r , означающую рекурсивный обход файлов в директориях.

Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles , например, vasya.exe или ChangeLog12 .

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

Мы сравниваем файлы в директориях mydir1 и mydir2 , игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles , чтобы исключить из сравнения ненужные файлы.

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

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

Источник