如何进行 N 路比较?

如何进行 N 路比较?

如何区分多个命令的输出?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 上使用的工具。

答案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

相关内容