2014-01-17 95 views
0

我被賦予了任務,看看我們是否正在通告一個IP地址列表(3000)。不是一個好主意,所以我複製了我們在一個文件中發佈的所有IP地址。現在我只需創建一個bash腳本並將該ip地址列表提供給該腳本,以便它可以在發佈ip地址列表的文件中找到該ip地址。如果找不到,則將其保存在一個文件中。這是我迄今爲止所擁有的。這個腳本的問題是我必須手動輸入每個IP地址。我如何在IP地址列表中輸入IP地址列表,並在IP地址列表中找到我們正在廣告的地址。先進的非常感謝。如何找到另一個文件中的IP地址列表

#!/bin/bash 

while true; do 
    echo -e "IP address: \c" 
    read ip 

    if grep --color "$ip" "ips"; then 
    echo $ip "was found" 
    echo $ip >> found 
    else 
    echo $ip "was NOT found" 
    echo $ip >> notFound 

    fi 

done 

回答

2

一個更好的腳本:

while read ip 
do 
    grep "$ip" "$ips" > /dev/null 2>&1 && echo "$ip" >> ip.found || echo "$ip" >> ip.notfound 
done  

名稱腳本「searchip.sh」
假設你的輸入文件是「iplist」,設置變量並像這樣調用:

ips=ips 
cat iplist | sh searchip.sh 

sh searchip.sh < iplist 

然後你得到兩個文件,一個是發現IP,另一種是IP找不到。
您需要的是外殼I/O重定向。

+0

這將表明如果IP只是列表中某個IP的子字符串,就會發現IP。另外,'.'對'grep'有特殊的含義,它是一個通配符,這可能導致僞造的匹配。您應該使用'grep -F -x'來匹配整行,而不用專門處理正則表達式字符。 – Barmar

2
$ script < list_of_ip_addresses 

這就是你需要的。

3

如果這兩個文件進行排序,你可以使用comm命令:

sort all_ip_addresses > all_ip_addresses_sorted 
sort adverted_ip_address > advertised_ip_address_unsorted 

comm -23 all_ip_addresses_sorted advertised_ip_addresses_sorted 

會顯示未公佈的IP地址,並且:

comm -12 all_ip_addresses_sorted advertised_ip_addresses_sorted 

將顯示廣告的IP地址。

您也可以通過避免使用過程中替換創建單獨排序的文件:

comm -23 <(sort all_ip_addresses) <(sort advertised_ip_addresses) 
+0

+1:優雅! @Barmar:過程替代的好地方? 'comm -12 <(sort all_ip_addresses)<(sort advertised_ip_addresses)' – grebneke

+0

是的,我已經多次使用過這個成語。但我不認爲這是必要的答案。 – Barmar

相關問題