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
Вывод,
В выходных данных 1c1 указывает, что 1-я строка первого файла должна быть изменена, чтобы сделать оба файла идентичными.
Давайте откатим вышеупомянутое изменение и добавим новую строку « Arch Linux » в sydeny.txt в конце файла и снова запустим команду diff,
Вывод команды diff « 7a8 » указывает, что после 7-й строки в первом файле нам нужно добавить еще одну строку, чтобы она соответствовала 8-й строке второго файла.
Давайте удалим «Arch Linux» и «Fedora» из sydney.txt, а затем попробуем сравнить эти файлы,
Вывод команды diff « 7d6 » указывает, что нам нужно удалить 7-ю строку в первом файле для синхронизации со вторым файлом в строке номер 6.
Пример: 2) Вывод команды Diff в контекстном формате (-c)
Используйте опцию «-c» в команде diff для вывода вывода команды diff в контекстном формате. Пример показан ниже,
[root@infoit.com.ua ~]# diff -c aachen.txt sydney.txt
Первые две строки представляют имена файлов вместе с датой и временем их изменения, а три символа звездочки (« *** ») указывают на первый файл, а три символа дефиса (« — ») указывают на второй файл.
Только одиночный дефис «-» указывает на то, что строку необходимо удалить, а символ плюса «+» указывает на то, что строку необходимо добавить в файл. Если какая-либо строка не требует изменений, то перед ней стоит два пробела.
Пример: 3) Вывод команды Diff в едином формате (-u)
Используйте опцию «-u» в команде diff, если вы хотите выводить результат в унифицированном формате, пример показан ниже,
[root@infoit.com.ua ~]# diff -u aachen.txt sydney.txt
Вышеупомянутый вывод в некоторой степени похож на контекстный формат, но в унифицированном формате вывод отображается в сжатой форме, здесь первые две строки указывают имена файлов вместе с датой и временем их изменения.
Три дефиса («-») представляют первый файл, а три символа «плюс» («+++») представляют второй файл, после двух знаков @ «-1,7» обозначает строки из 1-го файла, а «+1,7» обозначает строки варьируются от 2-го файла. Кроме того, символ (+ Core OS) указывает, что эту строку необходимо добавить в первый файл, а символ дефиса (-Fedora) указывает, что эту строку необходимо удалить из первого файла, чтобы сделать его идентичным второму файлу.
Пример: 4) Игнорировать регистр при сравнении файлов (-i)
По умолчанию команда diff чувствительна к регистру, и если вы хотите игнорировать чувствительность к регистру в команде diff, используйте параметр «-i», пример показан ниже,
Предположим, у нас есть следующее содержимое двух файлов
Запустите команду 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, рассмотрев приведенные выше примеры. Не стесняйтесь делиться своими отзывами и комментариями.