如何在 bash 中比较从多个文件中收集的两列 IP 和主机名

  • 本文关键字:两列 IP 主机 比较 bash 文件 bash
  • 更新时间 :
  • 英文 :


我正在尝试从多个文件中获取 IP,在 DNS 中查找它们并将它们与同一文件中已有的主机名进行比较,以确保两者都正确。然后打印出任何错误的内容。

我已经收集到我需要将信息放入数组中并以某种方式对它们进行差异。

这是我可怕的 bash 代码,它不起作用。我很确定至少我的 for 循环是错误的:

declare -a ipaddr=(`grep -h address *test.com.cfg | awk '{print $2}'`)
declare -a host_names=(`grep -h address *test.com.cfg | awk '{print $2}'`)
for i in "${ipaddr[@]}"
do
lookedup_host_names=( $(/usr/sbin/host ${ipaddr[@]} | awk '{print $5}' | cut -d. -f1-4 | tr '[:upper:]' '[:lower:]'))
done
if [[ -z diff <(printf "%sn" "${lookedup_host_names[@]}"| sort ) <(printf "%sn" "${host_names[@]}"| sort) ]]
then
printf "%sn" "${lookedup_host_names[@]}"
fi

我看不出你的数组ipaddr和host_names有什么区别。假设您的文件包含以下行

address 1.2.3.4 somehost.tld

像这样的脚本可能会做你想要的。

cat *test.com.cfg | grep address | while read line; do  
    IP=$(awk {'print $2'}); 
    CO=$(awk {'print $3'}); 
    CN=$(host $CO | cut -d ' ' -f 4)
    [ "$CN" = "$IP" ] || echo "Error with IP $IP"; 
done

两个主要问题是 for 循环每次都会覆盖数组而不是追加,并且差异检查无效。

要快速修复 for 循环,您可以使用 += 而不是 = ,.e.g lookedup_host_names+=( ... )

要做差异,你真的不需要条件。你可以跑

diff <(printf "%sn" "${host_names[@]}"| sort ) <(printf "%sn" "${lookedup_host_names[@]}"| sort)

它会以大多数 Unix 用户熟悉的 diff 格式显示两者之间的任何差异(请注意,我切换了参数,因为第一个参数应该是原始的)。

如果像您的示例一样,您确实想比较它们并显示整个最终列表(如果有差异),您可以这样做

if diff <(printf "%sn" "${host_names[@]}"| sort ) <(printf "%sn" "${lookedup_host_names[@]}"| sort) > /dev/null
then
    printf "%sn" "${lookedup_host_names[@]}"
fi

最新更新