Сравнение файлов в Linux с помощью diff
Сравнение файлов
Предположим у вас есть файл 1 следующего содержания
a
И файл 2 у которого первая строка пустая
a
сравнить их можно командой diff
diff 1 2
0a1 >
В выводе команды diff содержится инструкция о том как из первого файла сделать второй.
0a1 означает:
После нулевой строки первого файла нужно добавить первую строку второго файла.
Другими словами: в начало первого файла нужно вставить первую (пустую) строку второго файла
и тогда файлы станут одинаковыми
> означает второй файл. После должно быть содеражание строки, которую нужно вставить, но она
в нашем случае пустая, поэтому ничего нет.
a - add - добавить
c - change - изменить
d - delete - удалить
Давайте убедимся что мы всё правильно поняли - откройте файл 2 и запишите какой-то текст в первую строку которая была пустой. Больше ничего менять не нужно.
cat 2
www.topbicycle.ru
a
Снова сравним файлы 1 и 2 . Мы ожидаем, что ничего не изменится, только после > появится наш текст
diff 1 2
0a1 > www.topbicycle.ru
Как видите, так и произошло, потому что чтобы из первого файла получить второй нужно в самое начало первого файла добавить строку с текстом www.topbicycle.ru
Если теперь попробовать сравнить не файл 1 с 2 а наоборот 2 с 1 . Что должно измениться: теперь файл 2 принят за основу и команда diff сообщит нам что нужно сделать чтобы получить из файла 2 файл 1
diff 2 1
1d0 < www.topbicycle.ru
1d0 означает, что нужно удалить первую строку первого файла и тогда мы попадаем в начало второго файла
< www.topbicycle.ru это содержание строки первого файла о которой идёт речь
Рассмотрим файл 3 у которого первая и вторая строки пустые а в третьей символ a
Подумайте самостоятельно, что будет если сравнить файлы
1 и 3.
А также наоборот 3 и 1
vi 1
a
vi 3
a
diff 1 3
0a1,2 > >
0a1,2 означает, что в начало файла 1 нужно добавить первую и вторую строки файла 3
Если сравнить наоборот
diff 3 1
1,2d0 < <
1,2d0 означает, что в файле
3
нужно удалить строки 1 и 2 и тогда мы попадаем в начало файла 1
0 в конце можно понимать как строку по которой произойдёт выравнивание файлов.
Для примера создадим файл 4 у которого первая строка это символ a, вторая строка символ b
vi 4
a
b
Добавим три пустые строки в середину и сохраним как файл 5
vi 5
a
b
Сравним 4 и 5
diff 4 5
1a2,4 > > >
Чтобы из файла 4 получить файл 5 нужно после первой строки файла 4 добавить строки со второй по четвёртую файла 5
Здесь всё просто, попробуем наоборото
diff 5 4
2,4d1 < < <
Чтобы из файла
5
получить файл
4
нужно строки со второй по четвёртую в файле 4 удалить и тогда мы
попадём на строку 1 файла
4
То есть в этом примере после удаления мы выровнялиьс по строке 1 а
не по началу файла как в предыдущем примере.
Предположим у вас есть файл 1 следующего содержания
a
b
c
И пустой файл 2 сравнить их можно командой diff
diff 1 2
1,3d0 < a < b < c
Расшифруем результат: нужно в первом файле удалить три первые строки и тогда файлы выровняются по началу файлов.
Если теперь добавить a в первую строку файла 2 и сравнить снова
diff 1 2
2,3d1 < b < c
Расшифруем результат: нужно в первом файле удалить вторую и третью строки и тогда файлы выровняются после первой строки файлов.
Предположим у вас есть файл websites.txt со списком сайтов
cat websites.txt
https://www.eth1.ru https://www.heihei.ru https://www.topbicycle.ru
Скопируйте его командой
cp websites.txt newsites.txt
Убедиться, что файлы одинаковые пока что легко, можно даже выполнить
cat newsites.txt
https://www.eth1.ru https://www.heihei.ru https://www.topbicycle.ru
И понять, что ничего не изменилось.
Если файл слишком большой можно воспользоваться командой diff
diff websites.txt newsites.txt
Пока файлы идентичны вывод будет пустым
Добавьте новую запись в файл newsites.txt
echo https://www.eth1.ru >> newsites.txt
cat newsites.txt
https://www.eth1.ru https://www.heihei.ru https://www.topbicycle.ru https://www.eth1.ru
Команда diff теперь покажет место, в котором файлы различаются
diff websites.txt newsites.txt
3a4 > https://www.eth1.ru
3a4 означает, что различие найдено между
третьей строкой первого файла и четвёртой строкой второго.
В данном случае четвёртой строки и первого файла просто нет
> https://www.eth1.ru это символы которых нет в первом файле
Внесите более мелкие изменения. Например удалим во втором файле www. перед heihei.ru
vi newsites.txt
https://www.eth1.ru https://heihei.ru https://www.topbicycle.ru https://www.eth1.ru
diff websites.txt newsites.txt
2c2 < https://www.heihei.ru --- > https://heihei.ru 3a4 > https://www.eth1.ru
< означает - в первом файле
> означает - во втором файле
diff находит все строки с различиями и выводит их. Поэтому если
вы сделаете ещё какие-то изменения в той же строке, например добавите в конец /Spain/
принципиально ничего не изменится
vi newsites.txt
https://www.eth1.ru https://heihei.ru/Spain/ https://www.topbicycle.ru https://www.eth1.ru
diff websites.txt newsites.txt
2c2 < https://www.heihei.ru --- > https://www.heihei.ru/Spain/ 3a4 > https://www.eth1.ru
Если добавить несколько пустых строк
https://www.eth1.ru https://www.heihei.ru https://www.topbicycle.ru https://www.eth1.ru
Будут показаны диапазоны с пустыми строками
1a2,5 > > > > 2a7,13 > > > > > > > 3a15 > https://www.eth1.ru
a2,5 значит, что со второй по пятую строки
a7,13 значит, что с седьмой по тринадцатую
Если удалить несколько строк
vi newsites.txt
https://www.eth1.ru https://www.eth1.ru
diff websites.txt newsites.txt
2c2 < https://www.heihei.ru --- > https://heihei.ru/Spain/ 3a4 > https://www.eth1.ru