Сравниваем файлы с помощью утилиты diff

diff

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

Как это работает

Допустим, у нас есть два файла file1.txt и file11.txt

File1.txt содержит в себе четыре строки текста

Что мне нужно сделать в пятницу вечером?
Купить продукты
Накормить кота
Посмотреть футбол с друзьями

В file11.txt имеются такие строки

Что мне нужно сделать в пятницу вечером?
Купить продукты
Выгулять собаку
Почитать книгу

Затем мы используем diff, чтобы посмотреть различия между содержимым этих файлов

# diff file1.txt file11.txt

Получаем вывод

3,4c3,4
Накормить кота
Посмотреть футбол с друзьями
---
Выгулять собаку
Почитать книгу

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

Первая строка вывода означает

Номера строк, относящиеся к первому файлу – file1.txt

Символ (a – добавить, с – изменить, d – удалить)

Номера строк, относящиеся ко второму файлу –file11.txt

В нашем случае «3,4с3,4» означает: «Строки 3 и 4 file1.txt должны быть заменены на строки 3 и 4 файла file11.txt». строки, возле которых, указан символ < – это содержимое первого файла file1.txt. строки с символом > относятся к содержимому второго файла. Символ — отделет строки первого фала от строк второго.

Следующий пример

У нас есть два файла

file1.txt

С содержимым

Что мне нужно сделать в пятницу вечером?
Купить продукты
Накормить кота

file11.txt

C содержимым

Что мне нужно сделать в пятницу вечером?
Купить продукты
Накормить кота
И рыбок

Пишем команду

# diff file1.txt file11.txt

Вывод

3а4
&amp;amp;gt; И рыбок

В данном случае имеется ввиду, что после строки 3 первого файла нам нужно добавить строку 4 со второго файла.

Мы работаем с небольшими файлами, поэтому расшифровывать подобные выводы нам не составит особого труда. Но что делать, если у нас большой файл? Для этого необходимо использовать опцию -c, которая выводит подробный вывод с объяснением.

Пишем команду

# diff-c file1.txt file11.txt

Вывод получится таким

*** file1.txt 2017-10-09 07:45:58.792405275 -0400
--- file11.txt 2017-10-09 07:46:09.672243151 -0400
***************
*** 1,4 ****
В пятницу вечером я
Куплю продукты
Покормлю кота его любимым деликатесом
- Обещаю ему
--- 1,3 ----

Первые две строки вывода показывают информацию про наши file1.txt, file11.txt, время последнего изменения. Первый файл обозначается знаком «***», второй «—».

*************** – строка разделитель

В нашем случае строка

*** 1,4 ****

указывает на то, что из первого файла приведены строки с первой по четвертую. Строка

— 1,3 —-

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

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

Унифицированный формат

Пишем команду

# diff -u file1.txt file11.txt

Получаем вывод, в котором строки двух файлов объединены.

--- file1.txt 2017-10-09 07:45:58.792405275 -0400
+++ file11.txt 2017-10-09 07:46:09.672243151 -0400
@@ -1,4 +1,3 @@
В пятницу вечером я
Куплю продукты
Покормлю кота его любимым деликатесом
-Обещаю ему

В первых двух строках указывается, что file1.txt обозначается символом —, file11.txt – символом «+++». Совпадающие строки из двух файлов никак не отмечены. Тем, где есть несоответствия, указываются знаки + или -.

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

Пишем

# diff mydir1 openscap_data

Получаем сообщение о том, что у нас таких нет, есть только один файл в каталоге openscap_data.

Для сравнения каталогов необходимо дописать опцию –r.

Чтобы разделить вывод на две колонки, используем опцию –u

Чтобы две колонки у нас выглядели эстетично, добавляем –W 100, задав ширину одной колонки 100 символов.

# diff -y -W 100 file1.txt file11.txt

Получаем вывод


В пятницу вечером я&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;| В пятницу вечером я
Куплю продукты&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;Куплю продукты
Покормлю кота его любимым деликатесом&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;                         | Покормлю кота его любимым деликатесом
Обещаю ему&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;lt;

Нам могут встречаться такие символы:

Пробел  – строки полностью совпадают;

‘|’ строки не совпадают, и либо обе приведены полностью, либо обе не полностью;

‘\’ строки не совпадают, первая строка приведена не полностью;

‘/ ‘ строки не совпадают, вторая строка приведена не полностью;

‘<‘ строка содержится только в первом файле;

‘>’ строка содержится только во втором файле;

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

‘)’ строка содержится только вo втором файле, но различие игнорируется.

Мы рассмотрели основные примеры использования команды diff. Подробно изучаем команды для работы с фалами и каталогами на нашем авторском курсе «Администрирование Linux. Базовый уровень»!

Залишити відповідь

Дякуємо, що поділились