2016-09-26 42 views
0

我有一個列表,列出了大約200個CIDR IP塊供我公司使用。我試圖覈實一個網頁的訪問者(一天幾千次點擊)是否來自這些區塊。理想情況下,我希望的輸出是不在範圍內的百分比和這些IP的列表,以便我可以進一步檢查它們。檢查IP地址列表是否在R的CIDR註釋IP塊列表中

我從iptools包中找到ip_in_range()函數,但它是1比1的比較結果。我認爲某種樂句或其他循環應該能夠完成我想要的,但我是一個新手,迄今爲止還沒有能夠拿出正確的符號。我相信我會想要採用IP#1並針對各種CIDR進行測試。一旦它變爲TRUE,它就可以停止,但這不會經常重複,所以我不能在所有塊中循環。然後循環將轉到IP#2並再次進入。事實上,我的故障率預計會很低,即使只是在每個IP旁邊輸出TRUE和FALSE也足以讓我手動排除故障。

我知道必須有一些通用的方法已經循環一個函數,需要2個輸入,我只是想不出正確的方式來短語搜索找到任何東西。

示例數據:

visitor_ip_addresses <- c("10.10.1.2", "10.34.21.4", "192.168.23.34", "172.16.34.78", "1.2.3.4", "192.168.4.6") 
ip_ranges <- c("10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12") 
+0

Thx戳在pkg!看看[GitHub上的版本](https://github.com/hrbrmstr/iptools)。它有兩個新的功能,我認爲你正在問什麼。如果沒有,請提出問題,我們將努力滿足您的需求。 – hrbrmstr

回答

2
devtools::install_github("hrbrmstr/iptools") 

library(iptools) 

visitor_ip_addresses <- c("10.10.1.2", "10.34.21.4", "192.168.23.34", 
          "172.16.34.78", "1.2.3.4", "192.168.4.6") 

ip_ranges <- c("10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12") 

ips_in_cidrs(visitor_ip_addresses, ip_ranges) 
## [1] TRUE TRUE TRUE TRUE FALSE TRUE 

ip_in_any(visitor_ip_addresses, ip_ranges) 
## # A tibble: 6 × 2 
##    ips in_cidr 
##   <chr> <lgl> 
## 1  10.10.1.2 TRUE 
## 2 10.34.21.4 TRUE 
## 3 192.168.23.34 TRUE 
## 4 172.16.34.78 TRUE 
## 5  1.2.3.4 FALSE 
## 6 192.168.4.6 TRUE 

還有一個原因,這是你的,我們還沒有證明兩種不同的功能,但一個使用了一些聰明的數學和其他用途的嘗試。我會測試每個看看哪個更適合生產使用。

+0

很好。我有一點痛苦讓一切安裝(更新軟件包,安裝tibble等),但我到了那裏。 我的輸出實際上是從你的輸出切換過來的,ips_in_cidrs給出了tbl_df,ip_in_any給出了列表,但是這似乎是完美的。他們都給出了相同的總和,所以正直看起來不錯。我的失敗比我想象中的要多,所以對我來說更多的工作。 – karthwyne

+0

很高興幫助(我可能只是錯誤粘貼輸出塊)。它將於10月份在CRAN上發佈,因此Win&macOS的二進制文件將可用。如果您有更多的功能請求,請不要猶豫提出問題。 – hrbrmstr