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

Сравнение файлов

diff man

Предположим у вас есть файл 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 > > >

To из файла 4 получить файл 5 нужно после первой строки файла 4 добавить строки со второй по четвёртую файла 5

Здесь всё просто, попробуем наоборото

diff 5 4

2,4d1 < < <

To из файла 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.urn.su https://www.heihei.ru https://www.topbicycle.ru

Скопируйте его командой

cp websites.txt newsites.txt

Убедиться, что файлы одинаковые пока что легко, можно даже выполнить

cat newsites.txt

https://www.urn.su https://www.heihei.ru https://www.topbicycle.ru

И понять, что ничего не изменилось.

Если файл слишком большой можно воспользоваться командой diff

diff websites.txt newsites.txt

Пока файлы идентичны вывод будет пустым

Добавьте новую запись в файл newsites.txt

echo https://www.aredel.com >> newsites.txt

cat newsites.txt

https://www.urn.su https://www.heihei.ru https://www.topbicycle.ru https://www.aredel.com

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

diff websites.txt newsites.txt

3a4 > https://www.aredel.com

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

В данном случае четвёртой строки и первого файла просто нет

> https://www.aredel.com это символы которых нет в первом файле

Внесите более мелкие изменения. Например удалим во втором файле www. перед heihei.ru

vi newsites.txt

https://www.urn.su https://heihei.ru https://www.topbicycle.ru https://www.aredel.com

diff websites.txt newsites.txt

2c2 < https://www.heihei.ru --- > https://heihei.ru 3a4 > https://www.aredel.com

< означает - в первом файле

> означает - во втором файле

diff находит все строки с различиями и выводит их. Поэтому если вы сделаете ещё какие-то изменения в той же строке, например добавите в конец /Spain/ принципиально ничего не изменится

vi newsites.txt

https://www.urn.su https://heihei.ru/Spain/ https://www.topbicycle.ru https://www.aredel.com

diff websites.txt newsites.txt

2c2 < https://www.heihei.ru --- > https://www.heihei.ru/Spain/ 3a4 > https://www.aredel.com

Если добавить несколько пустых строк

https://www.urn.su https://www.heihei.ru https://www.topbicycle.ru https://www.aredel.com

Будут показаны диапазоны с пустыми строками

1a2,5 > > > > 2a7,13 > > > > > > > 3a15 > https://www.aredel.com

a2,5 значит, что со второй по пятую строки

a7,13 значит, что с седьмой по тринадцатую

Если удалить несколько строк

vi newsites.txt

https://www.urn.su https://www.aredel.com

diff websites.txt newsites.txt

2c2 < https://www.heihei.ru --- > https://heihei.ru/Spain/ 3a4 > https://www.aredel.com

Share in social media: