2014-09-29 84 views
1

我有一個文本文件,其中包含一個很長的IP地址列表排序。該文件的示例如下:外殼腳本來檢查和插入IP地址

103.21.244.0/22  1; #Cloudflare 
103.22.200.0/22  1; #Cloudflare 
103.31.4.0/22  1; #Cloudflare 
104.16.0.0/12  1; #Cloudflare 
108.162.192.0/18 1; #Cloudflare 
141.101.64.0/18  1; #Cloudflare 
162.158.0.0/15  1; #Cloudflare 
173.245.48.0/20  1; #Cloudflare 
188.114.96.0/20  1; #Cloudflare 
190.93.240.0/20  1; #Cloudflare 
197.234.240.0/22 1; #Cloudflare 
198.41.128.0/17  1; #Cloudflare 
199.27.128.0/21  1; #Cloudflare 

我想寫一個shell腳本,執行以下操作:

  1. 對於給定的IP地址(例如1.2.3.4)或IP範圍(例如1.2.3.0/24),找出它是否已經在文件中。

  2. 如果是,則什麼也不做。如果不是,則將其插入到正確位置的文件中。

問題:

A.我被困在一個檢查IP地址或IP範圍是否已在該文件中,因爲一個簡單的grep不會做。例如,對於IP 188.114.98.200,grep將返回負數,實際上已經由188.114.96.0/20表示。同樣適用於188.114.98.0/24

B.我也無法知道如何在正確的位置插入IP地址/範圍條目而不會擾亂排序順序。

有人可以幫忙嗎?非常感謝你。

編輯:

好了,特別是如果有在其他語言中已經存在的庫,可以把工作做好,望着建議後,我想我也不必無謂地限制自己猛砸,容易。

+1

至於插入到正確的地方,我只想追加到尾部,然後再打文件。不太確定匹配'..98.200'和'.96.0/20'。祝你好運。 – shellter 2014-09-29 03:29:42

+1

請解釋您確定「188.114.98.200」等於「188.114.96.0/20」或「188.114.98」的邏輯。0/24'。 – 2014-09-29 05:26:43

+0

@AbhishekPathak大概通過某種網絡掩碼邏輯:http://en.m.wikipedia.org/wiki/Classless_Inter-Domain_Routing – deau 2014-09-29 07:19:48

回答

1

在我看來,比較/匹配IP格式的字符串將是相當惱人的。只有使用bash參數替換(記錄爲here,查找${var#Pattern}, ${var##Pattern}),這個page(清單4)具有將IP字符串轉換爲整數數組的良好且簡單的技巧。

如果你想抓住面具,添加像IP[5]=${tmp##*/}(與linux mag pdf的符號)的東西。

對於簡單的IP比較,您可以簡單地使用bash的算術評估((...))(例如記錄的here)比較/匹配整數數組。

對於更復雜的CIDR匹配,要麼你願意自己實現相當多的邏輯,要麼嘗試在大多數Linux發行版上可用的工具,如ipcalc(檢查this)。

+0

謝謝。但是,如果已經有一個庫來進行IP地址的比較和匹配,即使它不是Bash,我也可以使用@klashxx的建議。 – GooDoo 2014-09-29 08:48:55

0

bash,但這任務是使用Python很簡單:

>>> print ips 
103.21.244.0/22  1; #Cloudflare 
103.22.200.0/22  1; #Cloudflare 
103.31.4.0/22  1; #Cloudflare 
104.16.0.0/12  1; #Cloudflare 
108.162.192.0/18 1; #Cloudflare 
141.101.64.0/18  1; #Cloudflare 
162.158.0.0/15  1; #Cloudflare 
173.245.48.0/20  1; #Cloudflare 
188.114.96.0/20  1; #Cloudflare 
190.93.240.0/20  1; #Cloudflare 
197.234.240.0/22 1; #Cloudflare 
198.41.128.0/17  1; #Cloudflare 
199.27.128.0/21  1; #Cloudflare 

>>> import iptools 
>>> [raw_range for raw_range in ips.splitlines()      
... if '188.114.98.200' in iptools.IpRangeList(raw_range.split()[0])] 
['188.114.96.0/20  1; #Cloudflare']        
>>>                 
>>> [raw_range for raw_range in ips.splitlines()      
... if '188.112.98.200' in iptools.IpRangeList(raw_range.split()[0])] 
[] 
+0

謝謝。我對Python並不熟悉,但如果它完成了這項工作,我可以接受。畢竟,Python已經安裝好了,創建邏輯來比較/匹配Bash中的IP地址似乎很麻煩。感謝您指點我的圖書館iptools。必須去了解更多。 – GooDoo 2014-09-29 08:46:17