2016-09-26 10 views
0

私の会社には約200個のCIDR IPブロックのリストがあります。私は、Webページへの訪問者(1日に数千のヒット)がそのブロックから来ているかどうかを検証しようとしています。理想的には、私が望む出力は範囲にないパーセンテージとそれらのIPのリストなので、さらにチェックすることができます。IPアドレスのリストがCIDRで指定されたIPブロックのリスト内にあるかどうかを確認します。R

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

pxを突くためのThx! [GitHubのバージョン](https://github.com/hrbrmstr/iptools)を見てください。それはあなたが求めていると思う2つの新しい機能を持っています。そうでない場合は、問題を提出して、お客様のニーズに対応します。 – 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 

我々はまだ文書化されていませんが、1は、いくつかの巧妙な数学を使用し、他の試行を使用しています。このための2つの異なる機能がある理由があります。私はそれぞれをテストして、プロダクションでの使用が優れているかどうかを確認します。

+0

素敵です。私は、すべてのインストール(パッケージの更新、tibbleのインストールなど)を受けるための少しの試練がありましたが、私はそこに行きました。 私の出力はあなたのものから実際に切り替えられましたが、ips_in_cidrsはtbl_dfを与え、ip_in_anyはリストを与えますが、これは完璧なようです。彼らはどちらも同じ金額を出しました。私は期待していたよりも多くの失敗を抱えています。 – karthwyne

+0

うれしかった(と私はたぶん出力チャンクを間違って貼り付けた)。それは10月にCRAN上にあるので、Win&macOSのバイナリが利用可能になります。より多くの機能要求がある場合は、躊躇せずに問題を提出してください。 – hrbrmstr

関連する問題