我这里有一段代码,它基本上获取一个名为“srcip”的文件(它只是一个 IP 地址列表)并将其与我的“~/db”文件进行比较,后者只是一个制表符分隔的服务器 IP HOSTNAME 数据库。目标是获取“srcip”文件并将其与 ~/db 文件中的内容进行匹配以获取主机名。它工作正常,但由于 DHCP 问题,有很多 IP 地址故意不在 ~/db 文件中,因此我们需要使用该host
命令进行真正的主机查找。我想要的基本上是在这个 awk 代码中放置一个 if 语句,它将检查 IP 是否与 db 不匹配,然后在该 IP 上运行 host 命令并给我输出。我该如何在这里做到这一点?
awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1]!=$2 {print $1, a[$1], $2}' OFS="\t" srcip ~/db
我知道 awk 可以使用if
如下语句来检查系统用户是否有 /bin/bash shell:
awk -F':' '{ if ($3 < '500' && $7 != "/bin/bash" ) print $0 }' /etc/passwd
如上所述,我需要使用一些可以快速解析这些数据的工具,例如 awk 或 sed,而不依赖于任何循环。请记住,我已经可以使用 while 循环来执行此操作,但考虑到 while 循环的性质,它会逐行解析它,并且对于我们使用来说很慢,因为我们一次要解析近 100,000 个 IP,甚至更多。对于 2000 行,我可以运行这段代码,但这并不是我想要做的:
#!/bin/bash
while read this_IP_address
do
db_host=$(grep "^$this_IP_address" ~/db | awk -F ' ' '{print $2}')
if [ "$db_host" = "" ]
then
host $this_IP_address | head -n 1 | awk -F ' ' '{print $5}'
else
echo $db_host
fi
done
答案1
听起来你需要这样的东西:
awk '
NR == FNR {ip[$1]=1; next}
$1 in ip {print; delete ip[$1]}
END {
for (i in ip) {
system("host " i)
}
}
' srcip ~/db