我正在尝试从多个文件中查找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
答案 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