Awk 脚本使用“if”根据条件运行命令

Awk 脚本使用“if”根据条件运行命令

我这里有一段代码,它基本上获取一个名为“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

相关内容