Сравниваем файлы с помощью утилиты 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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| В пятницу вечером я Куплю продукты&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;Куплю продукты Покормлю кота его любимым деликатесом&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Покормлю кота его любимым деликатесом Обещаю ему&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Нам могут встречаться такие символы:
Пробел – строки полностью совпадают;
‘|’ строки не совпадают, и либо обе приведены полностью, либо обе не полностью;
‘\’ строки не совпадают, первая строка приведена не полностью;
‘/ ‘ строки не совпадают, вторая строка приведена не полностью;
‘<‘ строка содержится только в первом файле;
‘>’ строка содержится только во втором файле;
‘(‘ строка содержится только в первом файле, но различие игнорируется;
‘)’ строка содержится только вo втором файле, но различие игнорируется.
Мы рассмотрели основные примеры использования команды diff. Подробно изучаем команды для работы с фалами и каталогами на нашем авторском курсе «Администрирование Linux. Базовый уровень»!