- Сравнение файлов в Linux – утилита diff
- Основные возможности утилиты diff
- Синтаксис команды diff и её основные опции
- Использование команды diff
- Создание патчей (заплаток) с помощью утилиты diff
- Заключение
- Как сравнить два текстовых файла с помощью Linux
- Создание файлов для сравнения
- Как сравнить два файла с помощью Linux
- Как просто показать, если файлы разные
- Как показать сообщение, если файлы одинаковые
- Как произвести различия бок о бок
- Ограничение ширины столбца
- Как игнорировать различия в регистре при сравнении файлов
- Как игнорировать конечный пробел в конце строки
- Как игнорировать все различия белого пространства между двумя файлами
- Как игнорировать пустые строки при сравнении двух файлов
- Резюме
- Команда Diff в Linux
- Как использовать команду diff
- Нормальный формат
- Формат контекста
- Единый формат
- Игнорировать регистр
- Выводы
Сравнение файлов в Linux – утилита diff
Очень часто возникают ситуации, когда необходимо сравнить содержимое двух или нескольких текстовых файлов. Например, для системных администраторов важно знать о конкретных различиях в конфигурации обслуживаемых систем. Программистам и разработчикам не менее важно быстро выявить различия в коде проектов, а также быстро создать патч, отражающий соответствующие изменения между двумя файлами или разными версиями одного. Это лишь самый распространённый перечень ситуаций, когда использование специализированных утилит для сравнения содержимого файлов приходится очень кстати и экономит кучу времени. Одной из таких утилит в системах Linux является diff – о ней и пойдёт речь в данной статье.
Основные возможности утилиты diff
Главное и, наверное, самое ценное преимущество diff в том, что эта утилита прекрасно работает через интерфейс командной строки. Вот почему она довольно популярна среди системных администраторов. Однако, это обстоятельство вполне закономерно объясняет и имеющийся у diff недостаток — работа с ней недостаточно наглядна, а для новичков довольно сложна.
В отличие от других аналогичных утилит, которые можно использовать исключительно в графической среде, diff прекрасно справляется со своими задачами в командной оболочке. Ну а некоторые неудобства, связанные с восприятием выводимых результатов работы утилиты — это в большинстве случаев, всего лишь недостаток пользовательского опыта работы как в командной оболочке, так и с самой утилитой diff. Стоит ещё раз отметить, что порог вхождения у неё для новичков действительно, довольно высок.
Утилита diff принимает на вход имена файлов, которые необходимо построчно сравнить, а также набор опций, управляющих режимами работы самой утилиты. В официальном руководстве (доступном по команде man diff) можно получить информацию о всех доступных для diff опциях. В данной же статье описываются лишь основные и часто используемые опции, а также простые и наглядные приёмы использования программы.
Синтаксис команды diff и её основные опции
Правила использования утилиты diff задаются командой, имеющей следующий синтаксис:
Здесь в качестве [FILES] задаются через пробел имена файлов для сравнения. [OPTION] определяет опции работы команды, основные из которых приведены в следующей таблице:
Опция | Значение |
-q, —brief | Выводит только различия файлов. |
-s | Выводит различия только при полном совпадении файлов. |
-c, -C | Выводит количество совпадающих строк. |
-u, -U | Выводит количество отличающихся строк. |
-y, —side-by-side | Выводит содержимое в столбцах для сравнения «бок о бок». |
-l, —paginate | Постраничный вывод с поддержкой перелистывания. |
-r, —recursive | Рекурсивное сравнение всех файлов в подкаталогах. |
-i, —ignore-case | Игнорировать регистр символов. |
-b, —ignore-space-change | Игнорировать изменения в изменении пробелов. |
-w, —ignore-all-space | Игнорировать все пробелы. |
-B, —ignore-blank-lines | Игнорировать пустые строки. |
-Z, —ignore-trailing-space | Игнорировать пробелы в конце строк. |
Перед тем, как использовать утилиту diff на практике, нужно разобраться с форматом вывода результатов сравнения. Вывод команды diff представляет собой последовательность инструкций, которые необходимо выполнить, чтобы файлы стали идентичными. Эти инструкции строятся на следующих обозначениях:
- a – добавление строки;
- d – удаление строки;
- c – изменение строки.
Вывод, например, может быть таким:
Здесь запись «2c2» означает, что вторая строка в файле №1 (оригинал) отличается от соответствующей (второй) строки в файле №2. Символ « » — файлу №2. Запись «—» чисто косметическая и предназначена для визуальной удобочитаемости результатов. Для наглядности, данный вывод соответствует результату сравнения двух файлов (file1 и file2) со следующим содержимым:
Использование команды diff
Теперь, для более наглядной демонстрации работы утилиты diff можно несколько усложнить условия задачи из предыдущей главы, изменив файл №2 следующим образом:
Тогда, выполнив команду
будет получен следующий вывод:
Здесь выражение «2c2,3» говорит о том, что второй строке (line2) в файле file1 соответствуют изменения в file2 в виде строк «line11» и «line22». Запись «2,3» означает диапазон строк в file2, содержащих изменения относительно строки №2 в file1. Запись «3c5,6» говорит о том, что после строки №3 оригинального файла в его изменённой версии (file2) были добавлены строки № 5 и №6, т. е. «line4» и «line5».
Создание патчей (заплаток) с помощью утилиты diff
Одной из особенностей diff является использование опции «-u» для создания патчей. Которые могут быть использованы для приведения содержимого файла к актуальному состоянию. Это очень удобно, ведь все инструкции для актуализации содержатся в одном файле-патче, который может быть обработан автоматически с помощью специализированной утилиты, например patch. Вывод для примера из предыдущей главы с использованием опции «-u» будет следующим:
Заключение
В заключение следует отметить, что использование утилиты diff вручную в командной оболочке довольно трудоёмко, неудобно и ненаглядно. Но в данном случае важно, что задачи по сравнению файлов могут быть в принципе выполнены. В настоящее время утилита diff используется для построения вокруг неё программных обёрток с графическим пользовательским интерфейсом (подобно kompare, diffmerge и т. д.), что и позволяет использовать её с максимальной эффективностью.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Как сравнить два текстовых файла с помощью Linux
Это руководство покажет вам, как использовать Linux для сравнения двух файлов и вывода их различий на экран или в файл.
Вам не нужно устанавливать какое-либо специальное программное обеспечение для сравнения файлов с помощью Linux, но вам нужно знать, как открыть окно терминала.
Как показано в связанном руководстве, существует много способов открыть окно терминала с помощью Linux. Самое простое – нажать клавиши CTRL, ALT и T одновременно.
Создание файлов для сравнения
Чтобы следовать этому руководству, создайте файл с именем «file1» и введите следующий текст:
Вы можете создать файл, следуя этим инструкциям:
Откройте файл, введя следующую команду: nano file1
Введите текст в нано-редактор
Нажмите CTRL и O, чтобы сохранить файл
Нажмите CTRL и X, чтобы выйти из файла
Теперь создайте другой файл с именем «file2» и введите следующий текст:
Вы можете создать файл, следуя этим инструкциям:
Откройте файл, введя следующую команду: nano file2
Введите текст в нано-редактор
Нажмите CTRL и O, чтобы сохранить файл
Нажмите CTRL и X, чтобы выйти из файла
Как сравнить два файла с помощью Linux
Команда, используемая в Linux для демонстрации различий между двумя файлами, называется командой diff.
Простейшая форма команды diff выглядит следующим образом:
Если файлы совпадают, то при использовании этой команды вывод не будет, однако, поскольку есть различия, вы увидите вывод, подобный следующему:
Первоначально вывод может показаться запутанным, но как только вы поймете терминологию, это будет довольно логично.
Вы можете видеть, что различия между этими двумя файлами следующие:
- Второй файл имеет только три строки, тогда как первый файл имеет 4.
- Второй файл показывает «1 зеленая бутылка» в третьей строке, тогда как первый файл говорит «одна зеленая бутылка»
- Второй файл говорит «там будет» вместо «там будет» в последней строке
Вывод команды diff показывает, что между строками 2 и 4 первого файла и строками 2 и 3 второго файла имеются различия.
Затем перечисляются строки от 2 до 4 из первого файла, за которыми следуют 2 разные строки во втором файле.
Как просто показать, если файлы разные
Если вы просто хотите узнать, отличаются ли файлы, и не интересуетесь, какие строки отличаются, вы можете выполнить следующую команду:
Если файлы отличаются, будет отображено следующее:
Если файлы одинаковые, то ничего не отображается.
Как показать сообщение, если файлы одинаковые
Когда вы запускаете команду, вы хотите знать, что она работает правильно, поэтому вы хотите, чтобы при запуске команды diff отображалось сообщение, независимо от того, являются ли файлы одинаковыми или разными
Чтобы выполнить это требование с помощью команды diff, вы можете использовать следующую команду :.
Теперь, если файлы одинаковые, вы получите следующее сообщение:
Как произвести различия бок о бок
Если есть много различий, то может очень быстро запутаться в том, какие различия на самом деле существуют между двумя файлами.
Вы можете изменить вывод команды diff, чтобы результаты отображались рядом. Для этого выполните следующую команду:
Выход для файла использует | символ, чтобы показать разницу между двумя строками, чтобы показать добавленную строку.
Интересно, что если вы запустите команду, используя наши демонстрационные файлы, тогда все строки будут отображаться как разные, за исключением последней строки файла 2, которая будет показана как удаленная.
Ограничение ширины столбца
При сравнении двух файлов рядом может быть трудно прочитать, если файлы имеют много столбцов текста.
Чтобы ограничить количество столбцов, используйте следующую команду:
Как игнорировать различия в регистре при сравнении файлов
Если вы хотите сравнить два файла, но вам все равно, совпадает ли регистр букв между двумя файлами, вы можете использовать следующую команду:
Как игнорировать конечный пробел в конце строки
Если при сравнении файлов вы заметили множество различий, и различия вызваны пробелами в конце строк, вы можете пропустить их как показанные как изменения, выполнив следующую команду:
Как игнорировать все различия белого пространства между двумя файлами
Если вас интересует только текст в файле и вам все равно, есть ли в одном месте больше пробелов, вы можете использовать следующую команду:
Как игнорировать пустые строки при сравнении двух файлов
Если вас не волнует, что в одном файле могут быть лишние пустые строки, вы можете сравнить файлы, используя следующую команду:
Резюме
Вы можете найти больше информации, прочитав руководство по команде diff.
Команду diff можно использовать в ее простейшей форме, чтобы показать различия между двумя файлами, но вы также можете использовать ее для создания файла diff как части стратегии исправления, как показано в этом руководстве к команде исправления Linux.
Другая команда, которую вы можете использовать для сравнения файлов, это команда cmp, как показано в этом руководстве. Это сравнивает файлы побайтно.
Источник
Команда 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 .
Если у вас есть вопросы, оставьте комментарий ниже.
Источник