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

时间:2014-01-10 21:48:25

标签: 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 "%s\n" "${lookedup_host_names[@]}"| sort ) <(printf "%s\n" "${host_names[@]}"| sort) ]]
then
printf "%s\n" "${lookedup_host_names[@]}"
fi

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

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

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

如果在你的例子中,你确实想要比较它们并显示整个最终列表,如果存在差异,你可以做到

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