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.

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.