我正在尝试从多个文件中查找grep in,在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发布于 2014-01-10 22:27:37
两个主要问题是,for循环每次覆盖数组而不是追加数组,而diff检查无效。
要快速修复for循环,可以使用+=而不是=、.e.g 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-01-10 22:25:42
我看不出您的数组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";
donehttps://stackoverflow.com/questions/21055022
复制相似问题