busybox expressão regular para grupo de endereços IP

1

Eu preciso validar um grupo de endereços IP que será exibido em um arquivo assim:

IP_SUBNETS = ['10.1.111.0', '10.2.111.0', '10.2.123.0']

Eu gostaria de escrever uma expressão regular que permita n número de endereços IP, desde que eles sejam delimitados por "," e tenham aspas simples ao redor deles, e toda a "lista" seja aberta e fechada por quadrados parênteses.

Eu consegui encontrar alguns exemplos básicos de expressões regulares, mas estou tendo dificuldades para encontrar algo que funcione para o busybox.

até agora, isso é o que eu tenho:

grep IP_SUBNETS myfile | cut -c 12- | grep '^\[[0-9].'

Mas parece que não consigo acertar o agrupamento. também conhecido como um grupo por sub-rede.

EDIT 1

#!/bin/sh
iplist=['10.112.123.0'] 
pass="$(echo $iplist | grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'"
echo "$pass"
    
por dot 12.09.2017 / 19:35

1 resposta

1

Algo como isso funciona aqui:

busybox grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'

(o busybox não é meu grep padrão, daí o prefixo "busybox").

Isso deve principalmente validar sua lista, embora não seja perfeita. Por exemplo, aceita 300.1.2.4 como um endereço IP válido. O regexp para totalmente validar que quatro números separados por pontos representam um endereço inicial de sub-rede válido seria muito mais complicado.

Para dividi-lo: primeiro, observe que parte dele é repetida. Chame esse I por um segundo. Então, você pode ver que é ^\[(I,)*I\]$ , o que gera uma lista separada por vírgulas de I s, com colchetes ao redor da lista inteira. Se você olhar o que é I , é ([0-9]{1,3}\.){3}[0-9]{1,3} , o que é mais simples se você notar outro padrão repetido, O = [0-9]{1,3} . É então (O.){1,3}O ... quais são seus quatro octetos separados por decimal. Em um shell script, é claro que você pode usar variáveis para construir o padrão a partir desses blocos de construção mais simples - uma grande ajuda para a legibilidade e a facilidade de manutenção.

Eu testei com os seguintes dados de teste (com resultado esperado como comentário, não na verdade no arquivo de dados de teste):

1.2.3.4                          # bad: no brackets
[1.2.3.4]                        # good
[1.2.3.44]                       # good
[1.2.3.4                         # bad: missing bracket
1.2.3.4]                         # bad: missing bracket
[1.2.3.4,]                       # bad: empty item
[1.2.3.4,5.6.7.8]                # good
[1.2.3.4,5.6.7.8,]               # bad: empty item
[1.2.3.4,5.6.7.E]                # bad: E is not a number
[1.2.3.4,,5.6.7.8]               # bad: empty item
[1.2.3.1234]                     # bad: 1234 is more than 3 digits

edit: você pode usar O = ([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]) - pode haver uma maneira mais simples de escrever isso, não tenho certeza - para obter apenas números de 0 a 255; que leva a um padrão muito mais longo:

busybox grep -E '^\[((([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]),)*(([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\]$'

... que pode ou não valer a pena, dependendo de como é importante validá-los totalmente.

    
por 12.09.2017 / 20:51