grep para um intervalo de IP?

2

Em uma caixa do RHEL 7 cujo endereço IP local é 10.0.0.159, o seguinte comando imprime o IP 10.0.0.159 :

$ echo "$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | \
   grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')""(rw,sync)" 

Para que o comando teria que mudar para imprimir '10 .0.0.0 / 8 "em vez disso?

    
por CodeMed 11.08.2018 / 02:37

2 respostas

4

NOTA: ifconfig é um cmd reprovado. você deve estar usando cmds. no pacote iproute2 daqui para frente. Abaixo, mostro como usar ip para realizar o que você deseja usando a ferramenta de substituição.

Em vez de fazer isso com ifconfig , recomendamos usar o comando ip .

IP CIDR

Este formulário mostra o endereço IP na notação CIDR:

$ ip addr list eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

-or-

$ ip a l eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

Rede CIDR

Este formulário mostra o endereço de rede na notação CIDR:

$ ip route show | awk '/eth0.*scope/ {print $1}'
10.0.2.0/24

ipcalc

Você também pode usar o comando ipcalc para manipular os endereços acima para calcular outros formatos. Por exemplo:

$ ipcalc -n $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
NETWORK=10.0.2.0

$ ipcalc -p $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
PREFIX=24

Com ipcalc , você pode usá-lo para formar mais simplesmente as variações desejadas, em vez de ter que usar muito sed & awk para analisar o texto que é tipicamente muito complicado de fazer.

    
por 11.08.2018 / 03:08
3

Para mudar uma linha de comando para fazer o que você quer, primeiro você precisa entender o que está fazendo. Aqui está uma análise:

echo "$(<something>)""(rw,sync)" 

Será executado something e considerado como entrada para seu echo . Todo o resto é um texto normal para ser echo 'ed.

ifconfig eth0

Obtém as informações da rede.

grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' 

Isola os vários IPs no seu sistema. -E diz ao grep para usar expressões regulares, e é por isso que você pode usar [0-9]* para corresponder todos os números juntos, por exemplo. -o diz ao grep para mostrar apenas a parte que corresponde à expressão regular, ao contrário de produzir a linha inteira que corresponde à condição do grep, como seria por padrão. Portanto, se, por exemplo, a linha de entrada for inet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0 , ela só produzirá inet addr:10.0.0.159 deixando de fora as partes Bcast e Mask .

grep -Eo  '([0-9]*\.){3}[0-9]*' 

Isso é exatamente o mesmo que acima, exceto sem o rótulo inet addr , o que significa que você está isolando especificamente o IP e removendo o rótulo. E finalmente,

grep -v '127.0.0.1'

está removendo esse IP da sua lista de saídas, porque você não se importa com o IP de loopback.

Como você pode ver, seu comando está obtendo a saída de ifconfig e filtrando as informações, isolando apenas as informações desejadas. Não está fazendo nenhum cálculo ou processamento de informações. Mas o que você deseja imprimir é a sub-rede e máscara, que são informações que não são explicitamente exibidas por ifconfig . Em outras palavras, você não pode simplesmente filtrar as coisas de maneira diferente para conseguir o que deseja. Você terá que fazer algum processamento, algum cálculo usando o campo Mask no final da linha. Em resumo, você não pode "alterar o comando para imprimir o que você deseja". Você tem que criar um comando completamente diferente.

A resposta do slm usa uma técnica similar (filtrando informações para manter apenas o que você quer), mas alterou a entrada para um comando que terá as informações necessárias. :-) Se você não tem um comando que produz exatamente o que você quer, e fazer algum processamento nele foi sua única opção, aqui está um conjunto feio de if s que você pode usar como exemplo ou base no futuro . Ele usa a primeira solução do slm e assume que sua máscara é sempre 8, 16 ou 24.

ip a l eth1 | awk '/inet.*brd/ {split($2,add,"/");split(add[1],ip,".");if(add[2]<=24){ip[4]=0} if(add[2]<=16){ip[3]=0} if(add[2]<=8){ip[2]=0} print ip[1]"."ip[2]"."ip[3]"."ip[4]"/"add[2];}'

Este comando divide a saída de ip entre add ress (10.0.0.159) e máscara (8). Em seguida, divide o IP em seus 4 números. Em seguida, define os números para zero de acordo com a máscara. Mas não é bitwise, o que significa que lidará apenas com as máscaras 8, 16 e 24, porque é isso que eu codifiquei. ;)

Espero que você possa aprender um pouco mais sobre as ferramentas à sua disposição. ^ _ ^

    
por 11.08.2018 / 03:53