De tempos em tempos, eu quero grep CIDR varia fora dos meus arquivos de log do Apache. Isso é fácil para intervalos que caem nos limites naturais (/ 8, / 16 e / 24), mas não é tão fácil para outros intervalos como / 17 e / 25.
Exemplos:
# 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
Essas regexes ignoram endereços IP que incluem zeros à esquerda, como 192.168.001.001
, o que não é um problema nos arquivos de log do Apache, mas pode estar em outros arquivos de log. As impressoras, em particular, parecem gostar dos zeros iniciais. É fácil adicionar os zeros opcionais à regex, mas isso torna a coisa toda um pouco mais difícil. Tem que haver uma maneira mais fácil.
Existe uma maneira fácil de selecionar linhas de um arquivo que corresponda a qualquer intervalo CIDR?
As extensões sofisticadas de regex serão consideradas, assim como as diferentes ferramentas (como awk
ou perl
se necessário, mas eu quero que seja uma linha única) se facilitarem o trabalho. Idealmente, o que eu gostaria é algo como
grep "[:CIDR 192.168.128.0/18:]" access_log
Uma ferramenta que converte um intervalo CIDR no regex apropriado também seria OK.
$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}
ou
$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log
Pontos de bônus se sua resposta também cobrir o IPv6.