我正在尝试编写一个脚本来从 5 个不同的地方获取信息并比较它们的差异。这些信息只是 IP 地址,我将它们放在文本文件中。我正在使用:
diff --from-file file1 file2 file3 file4 file5
Run Code Online (Sandbox Code Playgroud)
比较它们并且它有效,但我需要显示哪个文件包含不同的信息。我希望只有一个或最多两个文件不匹配。
如果您将 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
Run Code Online (Sandbox Code Playgroud)
-q您还可以使用带有或 的简短输出--brief。
# diff -q --from-file file1 file[2-5]
Files file1 and file3 differ
Files file1 and file5 differ
Run Code Online (Sandbox Code Playgroud)
另一种解决方案可能是对所有文件运行校验和程序,例如 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
Run Code Online (Sandbox Code Playgroud)
或者你可以将它与uniq结合起来,如下所示:
# hashlen=32 # MD5 outputs 32 hexadecimals
# md5sum file* | sort | uniq --group --check-chars=${hashlen}
88fa9f694690e11239096536ccf2702b file1
88fa9f694690e11239096536ccf2702b file2
88fa9f694690e11239096536ccf2702b file4
9cd599a3523898e6a12e13ec787da50a file3
9cd599a3523898e6a12e13ec787da50a file5
Run Code Online (Sandbox Code Playgroud)
在 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)
Run Code Online (Sandbox Code Playgroud)