我正在尝试编写一个脚本来从 5 个不同的地方获取信息并比较它们的差异。这些信息只是 IP 地址,我将它们放在文本文件中。我在用着:
diff --from-file file1 file2 file3 file4 file5
比较它们并且它有效,但我需要显示哪个文件包含不同的信息。我预计只有一个或最多两个文件不匹配。
答案1
如果您将 diff 格式更改为统一的-u
或--unified
,则会显示文件名。
# diff -u --from-file file1 file[2-5]
--- file1 2020-10-30 11:02:22.223269990 +0200
+++ file3 2020-10-30 11:02:35.445984702 +0200
@@ -1 +1 @@
-original
+new
--- file1 2020-10-30 11:02:22.223269990 +0200
+++ file5 2020-10-30 11:02:40.625872942 +0200
@@ -1 +1 @@
-original
+new
-q
您还可以使用带有或 的简短输出--brief
。
# diff -q --from-file file1 file[2-5]
Files file1 and file3 differ
Files file1 and file5 differ
另一种解决方案可能是对所有文件运行校验和程序,例如 md5sum、sha1sum 等,并查看哪个文件的校验和与第一个文件不同。
在 GNU 系统上你甚至可以将它与awk像这样:
# md5sum file* | awk '{h[$1] = h[$1] " " $2} END {for(k in h) printf("%s:%s\n", k, h[k])}'
88fa9f694690e11239096536ccf2702b: file1 file2 file4
9cd599a3523898e6a12e13ec787da50a: file3 file5
或者你可以将它与独特的像这样:
# hashlen=32 # MD5 outputs 32 hexadecimals
# md5sum file* | sort | uniq --group --check-chars=${hashlen}
88fa9f694690e11239096536ccf2702b file1
88fa9f694690e11239096536ccf2702b file2
88fa9f694690e11239096536ccf2702b file4
9cd599a3523898e6a12e13ec787da50a file3
9cd599a3523898e6a12e13ec787da50a file5
在 FreeBSD 系统上你可以将它与awk像这样:
# md5 file* | awk -F ' = ' '{h[$2] = h[$2] " " substr($1, index($1, "("))} END {for(k in h) printf("%s:%s\n", k, h[k])}'
9cd599a3523898e6a12e13ec787da50a: (file3) (file5)
88fa9f694690e11239096536ccf2702b: (file1) (file2) (file4)
答案2
扩散可以处理 5 个输入(sudo apt-get install diff)。从手册页:
Diffuse is a graphical tool for merging and comparing text files. Diffuse is able
to compare an arbitrary number of files side-by-side and gives users the ability
to manually adjust line matching and directly edit files.
答案3
如果只有一个文件不同,那么您可以使用类似
md5sum file* | uniq -f 2
uniq -f 2
将避免字段 2(文件名)。