我这里有一段代码基本上是一个名为'srcip'的文件(它只是一个IP地址列表),并将它与我的'〜/ db'文件进行比较,该文件只是我们拥有的服务器的制表符分隔的IP HOSTNAME数据库在我们的环境中。目标是获取'srcip'文件并将其与〜/ db文件中的内容进行匹配以获取主机名。它运行正常但由于DHCP问题,有很多IP地址故意不在〜/ db文件中,因此我们需要使用该host
命令进行真正的主机查找。我想要的是基本上在这个awk代码中放置一个if语句来检查数据库中的IP是否不匹配,然后在该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