9 Примеров команд ‘diff’ в Linux

9 Примеров команд ‘diff’ в Linux

 

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

Синтаксис команды diff:

# diff <options> file1 file2

Вывод команды diff может быть в следующем формате:

  • Нормальный (по умолчанию)
  • Контекст
  • Унифицированный

В выводе команды diff используются следующие символы:

  • a -> указывает, что что-то было добавлено
  • c -> указывает, что какой-то текст был изменен
  • d -> указывает, что какой-то текст был удален

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

В этой статье мы изучим команду Linux diff с различными практическими примерами,

Пример: 1) Сравните два файла с помощью команды diff

Предположим, у нас есть два файла aachen.txt и sydney.txt, и следующее содержимое этих файлов:

[root@infoit.com.ua ~]# cat aachen.txt
Linux Rocks in the open source world, followings are the linux distributions:
CentOS
Red Hat
Ubuntu Debian
Linux Mint
OpenSUSE
Fedora
[root@infoit.com.ua ~]# cat sydney.txt
Linux Rocks in the open source world, followings are the linux distributions:
CentOS
Red Hat
Ubuntu Debian
Linux Mint
OpenSUSE
Fedora
[root@infoit.com.ua ~]#

Давайте сравним содержимое этих файлов с помощью команды diff,

[root@infoit.com.ua ~]# diff aachen.txt sydney.txt
[root@infoit.com.ua ~]#

Приведенный выше вывод подтверждает, что оба файла идентичны. Давайте внесем некоторые изменения в aachen.txt, перепишем open source как « open-source ».

Теперь повторно запустите команду diff,

[root@infoit.com.ua ~]# diff aachen.txt sydney.txt

Вывод,

9 Примеров команд 'diff' в Linux

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

Давайте откатим вышеупомянутое изменение и добавим новую строку « Arch Linux » в sydeny.txt в конце файла и снова запустим команду diff,

9 Примеров команд 'diff' в Linux

Вывод команды diff « 7a8 » указывает, что после 7-й строки в первом файле нам нужно добавить еще одну строку, чтобы она соответствовала 8-й строке второго файла.

Давайте удалим «Arch Linux» и «Fedora» из sydney.txt, а затем попробуем сравнить эти файлы,

9 Примеров команд 'diff' в Linux

Вывод команды diff « 7d6 » указывает, что нам нужно удалить 7-ю строку в первом файле для синхронизации со вторым файлом в строке номер 6.

Пример: 2) Вывод команды Diff в контекстном формате (-c)

Используйте опцию «-c» в команде diff для вывода вывода команды diff в контекстном формате. Пример показан ниже,

[root@infoit.com.ua ~]# diff -c aachen.txt sydney.txt

9 Примеров команд 'diff' в Linux

Первые две строки представляют имена файлов вместе с датой и временем их изменения, а три символа звездочки (« *** ») указывают на первый файл, а три символа дефиса («  ») указывают на второй файл.

Только одиночный дефис «-» указывает на то, что строку необходимо удалить, а символ плюса «+» указывает на то, что строку необходимо добавить в файл. Если какая-либо строка не требует изменений, то перед ней стоит два пробела.

Пример: 3) Вывод команды Diff в едином формате (-u)

Используйте опцию «-u» в команде diff, если вы хотите выводить результат в унифицированном формате, пример показан ниже,

[root@infoit.com.ua ~]# diff -u aachen.txt sydney.txt

9 Примеров команд 'diff' в Linux

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

Три дефиса («-») представляют первый файл, а три символа «плюс» («+++») представляют второй файл, после двух знаков @ «-1,7» обозначает строки из 1-го файла, а «+1,7» обозначает строки варьируются от 2-го файла. Кроме того, символ (+ Core OS) указывает, что эту строку необходимо добавить в первый файл, а символ дефиса (-Fedora) указывает, что эту строку необходимо удалить из первого файла, чтобы сделать его идентичным второму файлу.

Пример: 4) Игнорировать регистр при сравнении файлов (-i)

По умолчанию команда diff чувствительна к регистру, и если вы хотите игнорировать чувствительность к регистру в команде diff, используйте параметр «-i», пример показан ниже,

Предположим, у нас есть следующее содержимое двух файлов

9 Примеров команд 'diff' в Linux

Запустите команду diff без каких-либо параметров,

[root@infoit.com.ua ~]# diff aachen.txt sydney.txt
5,6c5,6
< Ubuntu debian
< Linux mint
---
> Ubuntu Debian
> Linux Mint
[root@infoit.com.ua ~]#

Теперь запустите команду diff с параметром -i,

[root@infoit.com.ua ~]# diff -i aachen.txt sydney.txt

[root@infoit.com.ua ~]#

Как видно из вышеприведенного вывода, команда diff проигнорировала чувствительность к регистру, когда мы использовали параметр -i.

Пример: 5) Файлы отчетов идентичны командам (-ам) diff

Могут быть некоторые ситуации, когда мы сравниваем файлы с помощью команды diff, и если содержимое идентично, мы хотим отобразить сообщение об идентичности файлов, это можно сделать, передав параметр «-s» в команде diff,

[root@infoit.com.ua ~]# cat filex.txt
DevOPs Engineer
Cloud Stack Engineer
Linux System Admin
Monitoring Team
[root@infoit.com.ua ~]# cat filey.txt
DevOPs Engineer
Cloud Stack Engineer
Linux System Admin
Monitoring Team
[root@infoit.com.ua ~]# diff -s filex.txt filey.txt
Files filex.txt and filey.txt are identical
[root@infoit.com.ua ~]#

Пример: 6) Игнорировать пробелы при сравнении файлов с помощью diff (-b)

Предположим, у нас есть два файла filea.txt и fileb.txt, в которых пробелы несовместимы , поэтому, если мы используем команду diff без какой-либо опции, она покажет разницу пробелов, даже если содержимое идентично, поэтому в таких случаях мы можем игнорировать несогласованные пробелы в команде diff с помощью опции -b , пример показан ниже,

[root@infoit.com.ua ~]# cat filea.txt
Hi,  LinuxTechi is a Linux based  blog. It contains linux  HowTo's  and  Tips  &  Tricks.
[root@infoit.com.ua ~]# cat fileb.txt
Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
[root@infoit.com.ua ~]#

Сравните файлы без какой-либо опции с помощью команды diff,

[root@infoit.com.ua ~]# diff filea.txt fileb.txt
1c1
< Hi,  LinuxTechi is a Linux based  blog. It contains linux  HowTo's  and  Tips  &  Tricks.
---
> Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks.
[root@infoit.com.ua ~]#

Теперь используйте параметр -b в приведенной выше команде diff

[root@infoit.com.ua ~]# diff -b filea.txt fileb.txt
[root@infoit.com.ua ~]#

Если вы хотите игнорировать все пробелы во время сравнения с помощью команды diff, используйте параметр « -w ».

[root@infoit.com.ua ~]# diff -w filea.txt fileb.txt

Пример: 7) Игнорировать пробелы в конце строки во время сравнения (-Z)

Если вы хотите игнорировать пробел в конце строки во время сравнения, используйте опцию « -Z ».

[root@infoit.com.ua ~]# diff -Z filea.txt fileb.txt

Используйте « -B » в команде diff, чтобы игнорировать все пустые строки во время сравнения,

[root@infoit.com.ua ~]# diff -B filea.txt fileb.txt

Пример: 8) Сравните два каталога с помощью команды diff

Предположим, у нас есть два каталога с именами lab01 и lab02, в них есть следующие файлы и подкаталоги

[root@infoit.com.ua ~]# ls -l lab01/
total 0
-rw-r--r--. 1 root root  0 Feb  1 17:49 filea.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 fileb.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 filec.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 filed.txt
drwxr-xr-x. 2 root root 23 Feb  1 17:50 sitea
[root@infoit.com.ua ~]# ls -l lab02/
total 0
-rw-r--r--. 1 root root  0 Feb  1 17:49 filea.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 fileb.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 filec.txt
-rw-r--r--. 1 root root  0 Feb  1 17:49 filed.txt
drwxr-xr-x. 2 root root 23 Feb  1 17:50 sitea
[root@infoit.com.ua ~]#

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

[root@infoit.com.ua ~]# diff -qr lab01/ lab02/
[root@infoit.com.ua ~]#

Где:

  • -q -> указывает команде diff сообщать только о разных файлах
  • -r -> предписывает команде diff рекурсивно искать разницу в подкаталогах

Поскольку мы получаем пустой вывод, это означает, что оба каталога идентичны. Давайте удалим filed.txt от lab02 , а затем попытаться сравнить,

[root@infoit.com.ua ~]# cd lab02/
[root@infoit.com.ua lab02]# rm -f filed.txt
[root@infoit.com.ua lab02]# cd
[root@infoit.com.ua ~]# diff -qr lab01/ lab02/
Only in lab01/: filed.txt
[root@infoit.com.ua ~]#

Приведенный выше вывод говорит, что filed.txt присутствует только в каталоге lab01.

Пример: 9) Перенаправление вывода команды diff в файл

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

[root@infoit.com.ua ~]# diff aachen.txt sydney.txt
9,10d8
< SLES
< Puppy Linux
[root@infoit.com.ua ~]# diff aachen.txt sydney.txt  > diff.txt
[root@infoit.com.ua ~]# cat diff.txt
9,10d8
< SLES
< Puppy Linux
[root@infoit.com.ua ~]#

Это все из этой статьи. Надеюсь, теперь вы лучше понимаете команду diff, рассмотрев приведенные выше примеры. Не стесняйтесь делиться своими отзывами и комментариями.