ときどき、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