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