有时我想从我的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
这些正则expression式会忽略包含前导零的IP地址,如192.168.001.001 ,这在Apache日志文件中不是问题,但可能位于其他日志文件中。 打印机似乎特别喜欢领先的零。 向正则expression式添加可选的零是很容易的,但它使整个事情变得更加困难。 必须有一个更简单的方法。
有没有一种简单的方法从文件中select符合任何CIDR范围的行?
花式正则expression式的扩展将被视为不同的工具(如awk或perl如果有必要,但我希望它是一行),如果他们使工作更容易。 理想情况下,我想要的是类似的东西
grep "[:CIDR 192.168.128.0/18:]" access_log
将CIDR范围转换为合适的正则expression式的工具也可以。
$ 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,则为奖励积分。
毫不意外,这是一个工具: grepcidr 。
在我知道的任何系统中,默认都没有包含它,但是你可以从这里下载它,它同时在Ubuntu软件包仓库和FreeBSD ports集合中。
(版本2.0也适用于IPv6networking)
最近发布的rgxg命令行工具会生成匹配CIDR块中所有地址的正则expression式:
$ 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 。