CIDR範囲のグレッピング


10

ときどき、ApacheログファイルからCIDR範囲をgrepしたいと思います。これは、自然境界(/ 8、/ 16、/ 24)に該当する範囲では簡単ですが、/ 17や/ 25などの他の範囲では簡単ではありません。

例:

# 192.168.0.0/16: (easy)
grep " 192\.168\." access_log

# 192.168.128.0/17: (more thought required)
grep -E " 192\.168\.(12[89]|1[3-9][0-9]|2[0-5][0-9])\." access_log

# 192.168.0.0/17: (more thought required)
grep -E " 192\.168\.([0-9]|[0-9][0-9]|1[01][0-9]|12[0-7])\." access_log

# 192.168.128.0/18: (straining my brain)
grep -E " 192\.168\.(1[2-8][0-9]|19[01])\." access_log

これらの正規表現は、などの先行ゼロを含むIPアドレスを無視します192.168.001.001。これは、Apacheログファイルには問題ではありませんが、他のログファイルにある可能性があります。特にプリンターは先行ゼロを好むようです。オプションのゼロを正規表現に追加するのは簡単ですが、全体を少し難しくするだけです。より簡単な方法が必要です。

CIDR範囲に一致するファイルから行を選択する簡単な方法はありますか?

ファンシーな正規表現拡張機能は、さまざまなツール(必要に応じて、awkまたはperl必要に応じて1行にしたいなど)と同様に、作業を容易にするものと見なされます。理想的には、私が望むのは次のようなものです

grep "[:CIDR 192.168.128.0/18:]" access_log

CIDR範囲を適切な正規表現に変換するツールも問題ありません。

$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}

または

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log

回答がIPv6もカバーする場合のボーナスポイント。


1
これを検索していると、IP範囲を正規表現に変換するためのWebベースのツールが見つかりました。
Ladadadada

回答:


17

当然のことながら、このためのツールがありますgrepcidr

私が知っているどのシステムにもデフォルトでは含まれていませんが、こちらからダウンロードでき、UbuntuパッケージリポジトリとFreeBSDポートコレクションの両方にも含まれています。

(バージョン2.0はIPv6ネットワークでも動作します)


2
IPv6機能が必要な場合、perlでNet :: CIDRを使用して恐ろしい何かを一緒にハッキングすることができます
voretaq7

私はまた、構築した小型のNode.jsベースのCLIツールのIPv4 CIDR-grepをのために
ミケーレPangrazzi

5

最近リリースされたrgxgコマンドラインツールは、CIDRブロックのすべてのアドレスに一致する正規表現を生成します。

$ rgxg cidr 192.168.128.0/18
192\.168\.(19[01]|1[3-8][0-9]|12[89])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])

または

$ rgxg cidr 2001:db8:a:b:c:d::/112
2001:0?[Dd][Bb]8:0?0?0?[Aa]:0?0?0?[Bb]:0?0?0?[Cc]:0?0?0?[Dd]((::[0-9A-Fa-f]{1,4}|::|:0?0?0?0(::|:[0-9A-Fa-f]{1,4}))|:0\.0(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){2})

詳細については、http://rgxg.sf.netを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.