Как мне сделать N-way diff?


14

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

Возможно ли это напрямую с каким-либо вариантом diffили мне нужно сохранить выходные данные всех команд во временные файлы, выбрать одну и разослать с ней остаток?


Контекст:

Я должен проверить вывод определенной команды на нескольких серверах и посмотреть, все ли они согласны. На данный момент просто отчет о том, что обнаружены какие-либо различия, кажется хорошим, но если это возможно, я бы хотел сказать: X% серверов согласны друг с другом, Y% друг с другом; или этот сервер Z является нечетным.

У меня есть четырехсторонняя многоадресная настройка LDAP, и я хочу убедиться, что ContextCSNзначения для всех четырех согласуются друг с другом.

Итак, теперь я делаю:

#! /bin/bash

for i in {1..4}.ldap 
do 
    ldapsearch -x -LLL -H ldap://$i -s base -b dc=example,dc=com contextCSN > $i.csn; 
done
set -e 
for i in {2..4}
do
    diff -q 1.csn $i.csn
done

И проверьте код ошибки скрипта. Есть ли лучшие инструменты для этого?

Любые инструменты, которые можно использовать в Ubuntu 14.04, приветствуются.

Ответы:


11

Инструмент для этого - Diffuse . Он также доступен в репозиториях (по крайней мере, в Debian и Arch, где я проверял). Это работает так, как вы ожидаете:

  diffuse file1 file2 file3 file4

и так далее.


Можно ли его использовать для написания сценариев?
Муру

Я получаю кучу ошибок Python GTK, и на man-странице Ubuntu 14.04 написано, что это графический инструмент, как и на man- странице
muru

Это похоже на действительно хороший инструмент сравнения, вероятно, начну использовать его сам. Спасибо за совет :)
Грэм,

7

Этот fdupesинструмент может быть вам полезен здесь (должен быть в репозиториях). Если у вас есть большое количество файлов для сравнения, вы можете использовать его, чтобы уменьшить объем работы, которую вы должны выполнить, указав, какие из них уже идентичны. Как отмечено ниже, он работает только с аргументами каталога. Если у вас есть все файлы для сравнения в одном каталоге, вы можете сделать что-то вроде:

fdupes .

Для идентификации файлов, которые одинаковы. Или:

comm -13 <(fdupes . |sort -u) <(find . -maxdepth 1 | sort)

Для идентификации файлов, которые являются уникальными.

Команда diff3также может быть полезной.


fdupesКажется, нужен каталог в качестве аргумента (легко обходится), но да, количество возвращаемых файлов fdupesочень полезно.
Муру

@ Муру, извини, пропустил это. Обновлено.
Грэм,

5

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

например:

#!/bin/sh
command="foo;bar|baz"
for server in server1 server2 server3 server4 server5 server6: do
    echo $server $(ssh $server "$command" |sha1sum)
done | sort -k2 

Это даст вам разделенный пробелами список серверов sha1sum. Серверы с одинаковым значением sha1sum имеют одинаковый вывод:

server1 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server3 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server6 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server2 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server4 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server5 dcdc24e139db869eb059c9355c89c382de15b987 *-

Вы можете выполнить дальнейшую обработку, чтобы получить список подходящих серверов, например:

#!/bin/sh
command="foo;bar|baz"
for server in server1 server2 server3 server4 server5: do
    echo $server $(ssh $server "$command" |sha1sum)
done | sort -k2 | while read srv sum; do
    if [ "$prevsum" == "$sum" ]; then 
        echo -n " "
    else
        echo
    fi
    echo -n $srv
    prevsum=$sum
done

который дает вывод, такой как:

server1 server3 server6
server2 server4
server5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.