首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较bash中从多个文件中选择的两列IP和主机名

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

Stack Overflow用户
提问于 2014-01-10 21:48:25
回答 2查看 149关注 0票数 0

我正在尝试从多个文件中查找grep in,在DNS中查找它们,并将它们与相同文件中已经存在的主机名进行比较,以确保两者都是正确的。然后打印出任何不对的地方。

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

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-10 22:27:37

两个主要问题是,for循环每次覆盖数组而不是追加数组,而diff检查无效。

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

要做到这一点,你并不需要一个条件。你可以直接跑

代码语言:javascript
复制
diff <(printf "%s\n" "${host_names[@]}"| sort ) <(printf "%s\n" "${lookedup_host_names[@]}"| sort)

这将显示出大多数Unix用户熟悉的diff格式的差异(注意,我切换了参数,因为第一个参数应该是原始的)。

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2014-01-10 22:25:42

我看不出您的数组ipaddr和host_names之间有什么不同。假设您的文件包含类似于

代码语言:javascript
复制
address 1.2.3.4 somehost.tld

像这样的剧本可以做你想做的事。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21055022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档