команда diff в Linux с примерами

Опубликовано: 16 Февраля, 2022

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

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

Специальные символы:

 а: добавить
c: изменить
d: удалить

Синтаксис:

diff [параметры] Файл1 Файл2

Допустим, у нас есть два файла с именами a.txt и b.txt, содержащие 5 штатов Индии.

$ ls
a.txt  b.txt

$ cat a.txt
Gujarat
Uttar Pradesh
Kolkata
Bihar
Jammu and Kashmir

$ cat b.txt
Tamil Nadu
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh

Теперь, применяя команду diff без каких-либо параметров, мы получаем следующий вывод:

$ diff a.txt b.txt
0a1
> Тамил Наду
2,3c3
<Уттар-Прадеш
 Андхра-Прадеш
5c5
 Уттар-Прадеш

Давайте посмотрим, что означает этот вывод. Первая строка вывода diff будет содержать:

  • Номера строк, соответствующие первому файлу,
  • Специальный символ и
  • Номера строк, соответствующие второму файлу.

Как и в нашем случае, 0a1, что означает, что после строк 0 (в самом начале файла) вы должны добавить Tamil Nadu, чтобы соответствовать второй строке файла номер 1. Затем он сообщает нам, что эти строки находятся в каждом файле, которому предшествует символ:

  • Строки, которым предшествует <, являются строками из первого файла.
  • Строки, которым предшествует > - это строки из второго файла.
  • Следующая строка содержит 2,3c3, что означает, что от строки 2 до строки 3 в первом файле необходимо изменить, чтобы соответствовать строке номер 3 во втором файле. Затем он сообщает нам эти строки с указанными выше символами.
  • Три дефиса («-») просто разделяют строки файла 1 и файла 2.

Чтобы сделать оба файла идентичными, сначала добавьте Тамил Наду в первый файл в самом начале, чтобы соответствовать строке 1 второго файла, после этого измените строки 2 и 3 первого файла, то есть Уттар-Прадеш и Калькутту, со строкой 3 второго файла, т.е. Андхра-Прадеш . После этого измените строку 5 первого файла, т.е. Джамму и Кашмир, на строку 5 второго файла, то есть Уттар-Прадеш .

Теперь посмотрим, как это выглядит, когда diff сообщает нам, что нам нужно удалить строку.

$ cat a.txt
Гуджарат
Андхра-Прадеш
Telangana
Бихар
Уттар-Прадеш

$ cat b.txt
Гуджарат
Андхра-Прадеш
Бихар
Уттар-Прадеш

$ diff a.txt b.txt
3d2
<Телангана

Здесь вывод 3d2 означает удаление третьей строки первого файла, т.е. Telangana, чтобы оба файла синхронизировались со строкой 2.

Параметры

Система Linux предлагает два разных способа просмотра вывода команды diff, то есть контекстный режим и унифицированный режим .

  1. -c (контекст): чтобы просмотреть различия в контекстном режиме, используйте параметр -c . Давайте попробуем разобраться в этом на примере, у нас есть два файла file1.txt и file2.txt :
    $ cat file1.txt
    Кот                                                                                                                                              
    мв                                                                                                                                               
    комм                                                                                                                                             
    cp 
    
    $ cat file2.txt
    Кот                                                                                                                                              
    cp                                                                                                                                               
    разница                                                                                                                                             
    комм
                                                                                                       
    $ diff -c file1.txt file2.txt                                                                                                             
    *** file1.txt Чт, 11 января, 08:52:37 2018                                                                                                         
    --- file2.txt 11 января, четверг, 08:53:01 2018 г.                                                                                                         
    ***************                                                                                                                                  
    *** 1,4 ****                                                                                                                                     
      Кот                                                                                                                                            
    - мв                                                                                                                                             
    - комм                                                                                                                                           
      cp                                                                                                                                             
    --- 1,4 ----                                                                                                                                     
      Кот                                                                                                                                            
      cp                                                                                                                                             
    + diff                                                                                                                                           
    + комм 
    

    Первый файл обозначен *** , а второй файл обозначен - .
    Строка с *************** является просто разделителем.

    Первые две строки этого вывода показывают нам информацию о файле 1 и файле 2 . Он перечисляет имя файла, дату модификации и время модификации каждого из наших файлов, по одному в каждой строке.
    В следующей строке есть три звездочки ***, за которыми следует диапазон строк от первого файла (в нашем случае строки с 1 по 4, разделенные запятой). Затем четыре звездочки **** . После этого отображается содержимое первого файла со следующими индикаторами:

    (i) Если строка должна быть неизменной, перед ней ставится два пробела.
    (ii) Если строку необходимо изменить, перед ней ставится символ и пробел. Символ означает следующее:

    (a) +: указывает на строку во втором файле, которую необходимо добавить в первый файл, чтобы сделать их идентичными.
    (b) -: указывает строку в первом файле, которую необходимо удалить, чтобы сделать их идентичными.
    Как и в нашем случае, необходимо удалить mv и comm из первого файла и добавить diff и comm в первый файл, чтобы сделать их идентичными.

    После того, что есть три тира - с последующим диапазоном линии из второго файла (в нашем случае строки с 1 по 4, разделенной запятой). Затем четыре черточки —- . Затем он показывает содержимое второго файла.

  2. -u (унифицированный): для просмотра различий в унифицированном режиме используйте параметр -u . Он похож на контекстный режим, но не отображает никакой избыточной информации или показывает информацию в сжатой форме.
    $ cat file1.txt
    Кот                                                                                                                                              
    мв                                                                                                                                               
    комм                                                                                                                                             
    cp 
    
    $ cat file2.txt
    Кот                                                                                                                                              
    cp                                                                                                                                               
    разница                                                                                                                                             
    комм
    
    $ diff -u file1.txt file2.txt
    --- file1.txt 2018-01-11 10:39: 38.237464052 +0000                                                                                              
    +++ file2.txt 2018-01-11 10: 40: 00.323423021 +0000                                                                                              
    @@ -1,4 +1,4 @@                                                                                                                                  
     Кот                                                                                                                                             
    -mv                                                                                                                                              
    -комм                                                                                                                                            
     cp                                                                                                                                              
    + diff                                                                                                                                            
    + комм
    

    Первый файл обозначается знаком - , а второй файл - +++ .
    Первые две строки этого вывода показывают нам информацию о файле 1 и файле 2 . Он перечисляет имя файла, дату модификации и время модификации каждого из наших файлов, по одному в каждой строке.
    После этого в следующей строке будет два символа @, за которыми следует диапазон строк из первого файла (в нашем случае строки с 1 по 4, разделенные запятой) с префиксом - и затем пробел, а затем снова следует диапазон строк из второго файл с префиксом + и двумя в конце со знаком @ . Далее следует содержимое файла в выводе, которое сообщает нам, какая строка остается неизменной, а какие строки необходимо добавить или удалить (обозначенные символами) в файле 1, чтобы сделать его идентичным файлу 2 .

  3. -i: по умолчанию эта команда чувствительна к регистру . Чтобы сделать эту команду нечувствительной к регистру, используйте параметр -i с diff .
    $ cat file1.txt
    собака
    мв
    CP
    комм
    
    $ cat file2.txt
    СОБАКА
    cp
    разница
    комм
    
    Без использования этой опции:
    $ diff file1.txt file2.txt
    1,3c1,3
    <собака
    <мв
     СОБАКА
    > cp
    > разница
    
    Используя эту опцию:
    $ diff -i file1.txt file2.txt
    2d1
     разница
    
  4. –Version: этот параметр используется для отображения версии diff, которая в настоящее время запущена в вашей системе.
    $ diff --version
    diff (GNU diffutils) 3.5
    Упаковано Cygwin (3.5-2)
    Авторское право (C) 2016 Free Software Foundation, Inc.
    Лицензия GPLv3 +: GNU GPL версии 3 или новее.
    Это бесплатное программное обеспечение: вы можете изменять и распространять его.
    НИКАКИХ ГАРАНТИЙ в той степени, в которой это разрешено законом.
    
    Авторы Пол Эггерт, Майк Хэртель, Дэвид Хейс,
    Ричард Столмен и Лен Тауэр.
    
    


Использованная литература:
Концепции и приложения Unix - Das, Sumitabha
Компьютерная надежда