【问题标题】:How to compare two columns of IP and hostnames grepped from multiple files in bash如何比较从bash中的多个文件中提取的两列IP和主机名
【发布时间】:2014-01-10 21:48:25
【问题描述】:

我正在尝试从多个文件中 grep 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 "%s\n" "${lookedup_host_names[@]}"| sort ) <(printf "%s\n" "${host_names[@]}"| sort) ]]
then
printf "%s\n" "${lookedup_host_names[@]}"
fi

【问题讨论】:

  • 有几个注意事项需要考虑。反向主机查找可能会返回主机名,但文件可能包含 CNAME。正向查找将返回所有 CNAME,而不仅仅是 IP 地址。最简单的方法是使用gethostip 使用-d 选项返回IP 地址,而不考虑CNAME。唯一需要注意的是多个 IP。当使用gethstip -d 时,具有多个 IP 地址的 DNS 名称将只返回一个 IP 地址。

标签: bash


【解决方案1】:

我看不出您的数组 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

【讨论】:

    【解决方案2】:

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

    要快速修复 for 循环,您可以使用 += 代替 =,例如 lookedup_host_names+=( ... )

    要进行差异,您实际上并不需要条件。你可以运行

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

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

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

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

    【讨论】:

    • 谢谢,+= 让我走上了正轨,这是最终脚本:
    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2022-10-18
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多