- Сравнение файлов в консоли Linux
- Погружение в diff
- Альтернативный взгляд
- Добавьте цветовую подсветку
- Как сравнить два текстовых файла с помощью Linux
- Создание файлов для сравнения
- Как сравнить два файла с помощью Linux
- Как просто показать, если файлы разные
- Как показать сообщение, если файлы одинаковые
- Как произвести различия бок о бок
- Ограничение ширины столбца
- Как игнорировать различия в регистре при сравнении файлов
- Как игнорировать конечный пробел в конце строки
- Как игнорировать все различия белого пространства между двумя файлами
- Как игнорировать пустые строки при сравнении двух файлов
- Резюме
Сравнение файлов в консоли 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
Это руководство покажет вам, как использовать 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, как показано в этом руководстве. Это сравнивает файлы побайтно.
Источник