O argumento -n1 diz que é para executar um comando para cada argumento. Como estou passando 255 argumentos via pipe, o xargs irá disparar 255 comandos ping, um para cada argumento. Você pode trocar o "1" pelo número que quiser, mas no caso do ping não irá funcionar.
E o argumento -P indica que execução paralela. Se eu quiser executar 3 pings por vez, a sintaxe seria -P3. Em nosso exemplo estamos usando -P0, que indica ao xargs para paralelizar quantos "ping" o sistema operacional permitir.
Por fim, temos a execução do comando "ping -c1 IP", que dispensa explicação... ou "man ping" se não entendeu né minha filha! rsrs
grep "bytes from"
Filtrar a saída do ping apenas pela linha de resposta, a que contém o seguinte formato:
64 bytes from xxx (xxx): icmp_seq=1 ttl=53 time=14.7 ms
Logo, se o IP informado estiver offline, o grep acima irá retornar vazio.
sed -se 's/^.* from \([0-9\.]*\):.*$/\1/'
Lembram da linha acima filtrada pelo grep? Este sed extrai o endereço IP que está entre parêntesis.
sort -V
Ordenar por versão. Um número de IP é similar a um número de versão. O sort consegue identificar isso e ordenar corretamente.
NOTA: eu sei, é possível fazer isso de forma bem mais simples utilizando o nmap, mas aí eu não teria a oportunidade de explicar o recurso de multi-threads do xargs por exemplo... já conhecia ele? :)
[2] Comentário enviado por eduardo em 03/08/2020 - 08:03h
Ótima dica Fábio! Desconhecia a possibilidade de multi-threads do xargs. Sensacional!
Uma nota: na realidade, o comando vai listar os dispositivos que respondem pacotes ICMP (ping) na rede, não os online. Se algum dispositivo estiver com o ICMP bloqueado, vai retornar que está offline, mesmo estando online. Por exemplo, estações windows com firewall habilitado bloqueiam o ping. Em um cenário em que você executa o comando para "ver um IP livre" para configurar um equipamento com IP manual, corresse o risco de duplicar o IP na rede (caso acerte algum que está sendo usado). Mas há solução!
Sempre que você envia um ping, mesmo que o equipamento de destino não responda, o endereço IP + MAC é adicionado na tabela ARP. O que não estão na rede, vai ter o MAC como "incompleto". Sendo assim, basta incrementar o comando com:
# arp -an | grep -v incompleto | cut -d' ' -f2 | sort