Jak zrobić różnicę w kierunku N-way?

14

Jak różnicować dane wyjściowe wielu poleceń? vimdiffmoże obsługiwać do czterech plików, ale diffsam wydaje się obsługiwać dokładnie dwa pliki.

Czy jest to możliwe bezpośrednio z jakimś wariantem diff, czy też muszę zapisać dane wyjściowe wszystkich poleceń w plikach tymczasowych, wybrać jeden i różnicować z nim resztę?


Kontekst:

Muszę sprawdzić dane wyjściowe określonego polecenia na wielu serwerach i sprawdzić, czy wszystkie się zgadzają. W tej chwili zgłaszanie, czy jakieś różnice zostaną znalezione, wydaje się dobre, ale jeśli to możliwe, chciałbym móc powiedzieć: X% serwerów zgadza się ze sobą, Y% ze sobą; lub ten serwer Z jest dziwny.

Mam czterostronną konfigurację LDAP z czterema ścieżkami i chcę sprawdzić, czy ContextCSNwartości dla wszystkich czterech są ze sobą zgodne.

Więc teraz robię:

#! /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

I sprawdź kod błędu skryptu. Czy są na to lepsze narzędzia?

Wszelkie narzędzia, których można używać w systemie Ubuntu 14.04 welcome.

muru
źródło

Odpowiedzi:

11

Narzędziem do tego jest Diffuse . Jest również ogólnie dostępny z repozytoriów (przynajmniej w Debianie i Archu, gdzie sprawdziłem). Działa tak, jak można się spodziewać:

  diffuse file1 file2 file3 file4

i tak dalej.

MariusMatutiae
źródło
Czy można go używać do tworzenia skryptów?
muru
Mam kilka błędów Python GTK i podręcznika na Ubuntu 14.04 mówi, że to narzędzie graficzne, podobnie jak Debian wheezy'S podręcznika: manpages.debian.org/cgi-bin/...
muru
To wygląda na naprawdę dobre narzędzie do porównywania, prawdopodobnie zacznę go używać samodzielnie. Dzięki za podpowiedź :)
Graeme
7

fdupesNarzędzie może się przydać do was tutaj (powinno być w repozytoriach). Jeśli masz dużą liczbę plików do porównania, możesz użyć ich do zmniejszenia pracy, którą musisz wykonać, poprzez określenie, które z nich są już identyczne. Jak zauważono poniżej, działa tylko z argumentami katalogu. Jeśli masz wszystkie pliki do różnicowania w jednym katalogu, możesz zrobić coś takiego:

fdupes .

Aby zidentyfikować pliki, które są takie same. Lub:

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

Aby zidentyfikować pliki, które są unikalne.

diff3Polecenia mogą być również użyteczne.

Graeme
źródło
fdupeswydaje się, że potrzebuje katalogu jako argumentu (łatwo go obejść), ale tak, liczba zwracanych plików fdupesjest bardzo przydatna.
muru
@muru, przepraszam, przegapiłem to. Zaktualizowano
Graeme
5

Jeśli chcesz tylko sprawdzić, czy pliki się zgadzają, naprawdę nie potrzebujesz różnic. Po prostu użyj sha1sumlub coś takiego.

na przykład:

#!/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 

To da ci rozdzieloną spacjami listę serwerów, pary sha1sum. Serwery z tym samym sha1sum mają tę samą moc wyjściową:

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

Możesz wykonać dalsze przetwarzanie, aby uzyskać listę pasujących serwerów, na przykład:

#!/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

co daje dane wyjściowe takie jak:

server1 server3 server6
server2 server4
server5
Brian Minton
źródło