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. ^ _ ^