ifconfig
Se eu entendi o que você está pedindo, você gostaria que um comando de uma linha pegasse a saída de ifconfig
e retornasse o próximo dispositivo eth: xx a ser usado.
Portanto, se tivermos eth0: 0, eth0: 1 e eth0: 2 em uso, o comando deve retornar 3?
Exemplo
Um comando como este deve fazer o que você quer.
$ if (ifconfig | grep -q "^eth"); then \
echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
else echo 0;fi
Então, se tivermos um dispositivo Ethernet:
$ ifconfig | grep eth
eth0:0 Link encap:Ethernet HWaddr F0:DE:F1:2F:7D:4E
Nosso comando retornaria 1:
$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1
Se não tivermos dispositivos Ethernet, retornaremos 0:
$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0
Detalhes
OK, parece que há muita coisa acontecendo aqui, mas é bastante simples.
- if statement - inicialmente precisamos saber se há qualquer dispositivos Ethernet, portanto, executamos
ifconfig
e fazemos grep na saída procurando por um. Se encontrarmos um, prosseguiremos para executarifconfig
novamente e analisá-lo. - 2nd ifconfig - Aqui estamos, na verdade, analisando a saída agora. Usamos o recurso PCRE de
grep
(-P
) para procurar as sequências que começam com ethXX :. A opção-o
retornará o dígito que ocorre após ethXX:. - sort - Nós então
sort
os resultados numericamente, caso tenhamos vários dispositivos ethXX: YY. - tail - retorna o último, este será o dispositivo ethXX: YY de maior valor.
- Em seguida, incrementamos esse número por meio do
$(( $(ifconfig ...) + 1 ))
. Portanto, se ethXX: YY for 0, obteremos0 + 1
, resultando em1
. - echo - então,
echo
os resultados da etapa 5. - Se não houver nenhum dispositivo eth presente na saída
ifconfig
, retorne 0, já que este será o primeiro.
ip addr
Se você quiser usar ip addr
, poderá usar este formulário da solução fornecida acima para fazer isso.
$ if (ip addr | grep -q "eth"); then \
echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
else echo 0;fi
Exemplo
Usando seus dados de amostra:
inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4
Este comando retornaria um 5:
$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5