Команда Diff для сравнения двух файлов в терминале Linux

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

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

Использовать команду diff очень просто. Вот синтаксис:

Но понять ее вывод - совсем другое дело. Не волнуйтесь, я объясню вывод, чтобы вы могли сравнить два файла и понять разницу между ними.

Понимание команды diff в Linux

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

Я добавил список в два разных файла, а затем изменил список:

  1. Изменение порядка списка
  2. Добавление букв
  3. Переключение регистра

Я сохранил эти похожие файлы как 1.txt и 2.txt. Вот как они выглядят до того, как вы что-либо сделаете.

Содержимое файла 1.txt:

Содержимое файла 2.txt:

Diff без опций

Давайте посмотрим, что произойдет, если запустить команду diff без каких-либо опций.

Запутались? Вы не одиноки. Вывод не совсем удобен для человека. Чтобы понять, что происходит, вам нужно больше узнать о том, как работает diff.

Может быть полезно знать, что когда выполняется анализ, файл2 [в синтаксисе] рассматривается как эталонный документ, с которым вы пытаетесь установить соответствие. Таким образом, можно сказать, что diff работает следующим образом:

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

Порядок имеет значение

Пример того, как отличается вывод в зависимости от порядка следования файлов:

Важные символы в выводе команды diff

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

Символ Значение
A Добавить
C Изменить
D Удалить
# Номера строк
- - Разделяет файлы в выходных данных
< Файл 1
> Файл 2

 

Объяснение вывода команды diff

Давайте посмотрим на первое различие в выводе:

Линия Пояснение
2c2 Строка 2 из файла 1, ИЗМЕНЕНА на строку 2 из файла 2.
< замок - > ЗАМОК Измените "замок" на "ЗАМОК", чтобы соответствовать файлу 2.txt

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

Линия Пояснение
3a4 После строки 3 файла 1 добавлена строку 4 файла 2.
> запись То есть добавить "запись" для создания 4-й строки в файле 1. Таким образом, файл 1.txt будет соответствовать файлу 2.txt

Аналогично:

Линия Пояснение
5d5 < запись Удалите текст "запись" из 5-й строки файла 1. Таким образом, файл 1.txt будет соответствовать файлу 2.txt

В команду не встроена функция проверки орфографии или словаря. Она не распознает "запись" и "записи" как родственные. Ее единственная цель - идеально сопоставить два файла.

Если посмотреть на результат, то перевести его довольно сложно. Маловероятно, что вы сэкономите много времени.

К счастью, есть опции, которые можно добавить, чтобы сделать все более человекопонятным. Давайте рассмотрим несколько различных примеров с использованием одного и того же списка.

Diff в контексте "Скопировано" с параметром -c

Опция контекста дает более наглядное представление по сравнению с более программной информацией, отображаемой по умолчанию. Продолжим с нашим примером текста.

Более важные символы в выводе команды diff

Символ Значение
+ Добавить
! Изменить
- Удалить
*** Файл 1
-- Файл 2

 

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

Сначала выводится первый файл, т.е. 1.txt, и его строки с 1 по 5. Говорится, что есть небольшое изменение в (части) строки 2 файла 1.txt и (части) строки 2 файла 2.txt.

Он также указывает, что строка номер 5 файла 1 была удалена (-) во втором файле.

- 1,5 -- указывает на начало второго файла и говорит о том, что строка 2 немного изменена по сравнению со строкой 2 файла 1. Он также указывает, что во втором файле добавлена строка 4 (+), а в файле 1 соответствующая строка отсутствует.

Diff в "Объединенном" контексте с опцией -u

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

Как вы можете видеть, он использует те же символы, что и раньше, но вместо символа change он предлагает внести изменения с помощью легко читаемых символов + или -. Здесь он рекомендует удалить строку 2 из файла 1.txt и заменить ее строкой 2 из файла 2.txt.

В дальнейшем он также предлагает добавить записи после строки, содержащей акустику, и удалить запись после строки, содержащей расширение.

Все эти изменения предлагаются для первого файла в команде diff. Это еще один сценарий, в котором полезно помнить, что программа diff использует второй файл из списка в качестве "оригинала" или основы для исправлений.

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

Сравнивать, но игнорировать регистры с помощью -i

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

Работает только с латиницей!

Diff с помощью --color

Вы можете использовать --color, чтобы выделить изменения в выводе команды diff. При выполнении команды секции вывода будут напечатаны разными цветами из палитры терминала.

diff 1.txt 2.txt --color

Быстрый анализ файлов с помощью опций команд diff -s и -q

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

При использовании -q вы узнаете, что файлы "отличаются". Если они не отличаются, вы не получите никакого результата.

Использование команды diff в Linux при работе с большими текстовыми файлами

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

Для этого примера я создал два файла с большими кусками текста (lorem ipsum). В каждой строке сотни столбцов. Это, очевидно, затрудняет сравнение строк.

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

Для экономии места я сделал скриншот вывода, чтобы вы могли посмотреть на него.

diff 1.txt 2.txt -u

Вы можете использовать некоторые из тех же концепций для анализа этих типов файлов. Они не будут работать хорошо, если файл не отформатирован должным образом. Некоторые большие блоки текста не имеют переносов строк. Вы, вероятно, сталкивались с подобными файлами, в которых нужно было включить "Word Wrap", чтобы весь текст отображался в отведенном пространстве без использования полосы прокрутки. Это происходит потому, что некоторые текстовые форматы не создают разрывы строк автоматически. В результате этого большие куски текста занимают всего 2-3 строки. Это можно легко исправить.

Команда fold используется для разбиения строк по количеству столбцов. Она может быть настроена таким образом, чтобы дать вам возможность выбрать, как будут реализованы эти новые разрывы строк.

В приведенном здесь примере вы собираетесь разделить файл по стандартной ширине и использовать опцию -s. Это позволяет программе делать разрывы ТОЛЬКО там, где есть пробельные символы, а не в середине текста.

Используйте fold для быстрой вставки переносов строк

Поскольку оба файла разбиты на 31 строку вместо 3, вы можете сравнить их гораздо эффективнее.

Вы можете немного облегчить чтение с помощью тега --minimal. Это облегчает чтение больших текстовых файлов.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий