N方向比較を実行するには?

N方向比較を実行するには?

複数のコマンドの出力をどのように区別しますか?vimdiff最大4つのファイルまでサポートできますが、それdiff自体は2つのファイルのみをサポートしているようです。

直接使用できるバリエーションはありますかdiff?それとも、すべてのコマンドの出力を一時ファイルに保存し、1つを選択して残りの部分を比較する必要がありますか?


コンテキスト:

複数のサーバーで特定のコマンドの出力を確認して、すべて一貫性があることを確認する必要があります。現在では違いが見つかったら報告するのが良いようですが、可能であれば次のように言えます。サーバーのX%は互いに一致し、Y%は互いに一致します。またはサーバーZが奇妙なサーバー。

4方向マルチマスターLDAP設定があり、ContextCSN4つの値がすべて一致することを確認したいと思います。

今私はそうします:

#! /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で利用可能なすべてのツールを歓迎します。

答え1

これを行うツールは広がる。通常、リポジトリでも使用できます(少なくとも私が確認したDebianとArchでは)。期待どおりに動作します。

  diffuse file1 file2 file3 file4

など。

答え2

このfdupesツールはあなたに役立つかもしれません(保存場所になければなりません)。比較するファイルの数が多い場合は、どのファイルがすでに同じかを識別できるため、実行する必要がある作業を減らします。以下に説明するように、ディレクトリパラメータでのみ機能します。比較したいすべてのファイルをディレクトリに配置すると、次のことができます。

fdupes .

同じファイルを識別します。または:

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

一意のファイルを識別します。

このdiff3コマンドも役に立ちます。

答え3

ファイルの一貫性のみを確認したい場合は、実際には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

関連情報