我不时地要在我的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
这些正则表达式会忽略包含前导零的IP地址,例如192.168.001.001
,这在Apache日志文件中不是问题,但可能在其他日志文件中。打印机似乎特别喜欢前导零。将可选的零添加到正则表达式很容易,但这只会使整个过程变得更加困难。必须有一种更简单的方法。
有没有一种简单的方法可以从文件中选择匹配任何CIDR范围的行?
花哨的正则表达式扩展将被认为是不同的工具(例如,awk
或perl
如果需要,但我希望它是一种工具),只要它们使工作变得容易。理想情况下,我想要的是
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
在搜索此内容时,我发现了一个基于Web的工具,用于将IP范围转换为正则表达式。
—
Ladadadada 2012年