搜索 CIDR 范围

Lad*_*ada 12 ip grep regex cidr

有时我想从我的 Apache 日志文件中 grep CIDR 范围。这对于落在自然边界(/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
Run Code Online (Sandbox Code Playgroud)

这些正则表达式会忽略包含前导零的 IP 地址,例如192.168.001.001,这在 Apache 日志文件中不是问题,但可能在其他日志文件中。打印机似乎特别喜欢前导零。将可选的零添加到正则表达式很容易,但它只会使整个事情变得更加困难。必须有更简单的方法。

有没有一种简单的方法可以从匹配任何 CIDR 范围的文件中选择行?

花式正则表达式扩展将被视为不同的工具(例如awkperl在必要时,但我希望它是单行的),如果它们使工作更容易。理想情况下,我想要的是

grep "[:CIDR 192.168.128.0/18:]" access_log
Run Code Online (Sandbox Code Playgroud)

将 CIDR 范围转换为适当的正则表达式的工具也可以。

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

或者

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log
Run Code Online (Sandbox Code Playgroud)

如果您的回答也涵盖 IPv6,则加分。

vor*_*aq7 17

毫不奇怪,有一个工具可以做到这一点:grepcidr.

我知道的任何系统默认都没有包含它,但是您可以从这里下载它,它也包含在 Ubuntu 软件包存储库和 FreeBSD 端口集合中。

(2.0 版也适用于 IPv6 网络)

  • 如果您需要 IPv6 功能,可以在 perl 中使用 Net::CIDR 一起破解一些可怕的东西...... (2认同)

小智 7

最近发布的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])
Run Code Online (Sandbox Code Playgroud)

或者

$ 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})
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅http://rgxg.sf.net