bash脚本:检查多个文件的值并返回哪些文件包含该值的最佳方法?
我不是bash专家,所以现在我有一个300行的脚本,试图完成一些我觉得可以通过一个更简单的方法完成的事情,我只是不知道 该脚本基本上检查来自不同来源的多个日志,以确定哪些主机(按IP地址)安装了某些服务。我将这些IP地址压缩为与每个已安装服务关联的多个文件 如何获取这些文件,比较其中的IP,并输出每个IP所在的文件?现在我有大量的嵌入式while循环,这些循环变得非常复杂,随着我尝试添加更多服务,它们开始难以更新。最终,我计划将此输出放在一个矩阵中,在该矩阵中,所有文件中都找到了每个唯一的IP,然后在每个IP上安装了一个“x”和每个相关服务 我没有IP的主列表,所以我没有一个简单的比较起点:\这使得循环更加困难bash脚本:检查多个文件的值并返回哪些文件包含该值的最佳方法?,bash,awk,sed,Bash,Awk,Sed,我不是bash专家,所以现在我有一个300行的脚本,试图完成一些我觉得可以通过一个更简单的方法完成的事情,我只是不知道 该脚本基本上检查来自不同来源的多个日志,以确定哪些主机(按IP地址)安装了某些服务。我将这些IP地址压缩为与每个已安装服务关联的多个文件 如何获取这些文件,比较其中的IP,并输出每个IP所在的文件?现在我有大量的嵌入式while循环,这些循环变得非常复杂,随着我尝试添加更多服务,它们开始难以更新。最终,我计划将此输出放在一个矩阵中,在该矩阵中,所有文件中都找到了每个唯一的IP,
谢谢大家。你们会想要这样的awk脚本(使用GNU awk实现真正的多维数组):
但是,在您编辑您的问题以提供一些示例输入和预期输出之前,这只是一个最佳猜测。您是否尝试过使用grep?您是否想要一个工具,它接受IP并为您提供包含该IP的文件列表,或者使用一个文件名并给出该文件中IP列表的工具?编辑您的问题以包含一些示例输入和预期输出。您可以使用Perl或Python吗?
$ cat tst.awk
{ hits[$0][ARGIND]++ }
END {
OFS = "\t"
printf "%s%s", "IP", OFS
for (fileNr=1; fileNr<=ARGIND; fileNr++) {
printf "%s%s", ARGV[fileNr], (fileNr<ARGIND?OFS:ORS)
}
for (ip in hits) {
printf "%s:%s", ip, OFS
for (fileNr=1; fileNr<=ARGIND; fileNr++) {
printf "%s%s", (hits[ip][fileNr]?"X":""), (fileNr<ARGIND?OFS:ORS)
}
}
}
$ cat file1
a
b
c
$
$ cat file2
a
d
$
$ cat file3
a
b
d
e
$
$ gawk -f tst.awk file1 file2 file3
IP file1 file2 file3
a: X X X
b: X X
c: X
d: X X
e: X