Expressão regular para excluir dados dentro de um determinado intervalo

0

Eu quero remover todos os endereços IP que estão no formato 10.20.30. * e cujos últimos 3 dígitos caem no intervalo de 0 a 200 e mover todos os IPs restantes para um novo arquivo.

Eu coloquei a lista de IPs para ser excluída no arquivo whiteIP.txt e seu conteúdo é:

^10.20.30.([0-1][0-9][0-9]|2[00])

E o conteúdo do meu arquivo original é:

10.20.30.150,20
10.20.30.134,20
10.20.30.201,20
10.20.30.5,20
10.20.30.250,20
10.20.30.42,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20

Estou tentando o comando:

grep -vE -f whitetest.txt testIP.txt

Está me dando um resultado errado. Deve me dar o seguinte resultado:

10.20.30.201,20
10.20.30.250,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20

Qualquer sugestão seria de grande ajuda.

    
por prashant1988 11.03.2015 / 07:44

2 respostas

1

Várias coisas:

. é um caractere especial, portanto, deve ser ignorado:

^10\.20\.30\.([0-1][0-9][0-9]|2[00])

2[00] corresponde a 20, não a 200:

^10\.20\.30\.([0-1][0-9][0-9]|200)

Você precisa lidar com números de um dígito e dois dígitos separadamente:

^10\.20\.30\.([0-1][0-9][0-9]|200|[0-9][^0-9]|[0-9][0-9][^0-9])

Isso dá o resultado correto:

$ grep -vE -f whitetest.txt testIP.txt
10.20.30.201 20
10.20.30.250 20
222.233.201.5 20
10.233.201.5 20
111.233.201.5 20
    
por 11.03.2015 / 07:51
0

Isso deve ter o que você quer, eu acho:

grep -vE '10\.20\.30\.(1|..?,|200)
' <<\IN
10.20.30.150,20
10.20.30.134,20
10.20.30.201,20
10.20.30.5,20
10.20.30.250,20
10.20.30.42,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20
IN

Basicamente, você só tem que excluir qualquer partida para 10.20.30 com um octeto final com menos de três caracteres, que começa com 1, ou seja, totalmente 200.

As impressões acima:

10.20.30.201,20
10.20.30.250,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20
    
por 11.03.2015 / 08:50