如何区分多个命令的输出?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