2014-01-10 19 views
0

我試圖從許多文件中grep IP,在DNS中查找它們並將它們與已存在於相同文件中的主機名進行比較以確保是正確的。然後打印出任何錯誤的東西。如何比較兩列IP和主機名從bash中的多個文件grepped

我已經收集到了我需要將信息放入數組中,並以某種方式區分它們。

這是我可怕的bash代碼不起作用。我敢肯定,至少我的循環是錯誤的:

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

有幾個注意事項需要考慮。 反向主機查找可能會返回一個主機名,但該文件可能包含CNAME。 正向查找將返回所有CNAME而不僅僅是IP地址。 最簡單的方法是使用'gethostip'使用'-d'選項來返回IP地址,無論CNAME如何。 這個唯一的警告是多個IP。使用'gethstip -d'時,具有多個IP地址的DNS名稱將僅返回一個IP地址。 – alvits

回答

0

兩個主要問題是你的for循環每次都會覆蓋數組而不是追加,而你的差異檢查是無效的。

要快速修復for循環,可以使用+=而不是=,例如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 
+0

謝謝,+ =讓我走上正軌,這裏是最後的腳本: – user3183570

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