arp
manipula as entradas no cache ARP do kernel, você provavelmente obterá muitas entradas (depende do tamanho da LAN). Como você está interessado apenas nos endereços IP, use a opção -n
para que arp
mostre endereços numéricos em vez de nomes de host primeiro.
Além disso, você normalmente obtém muitos endereços IP dependendo do tamanho da sua LAN, então você provavelmente deve usar uma matriz em vez de uma variável para armazenar os endereços IP.
O seguinte comando retira os endereços IP do cache arp
e os coloca no array addrs
:
addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )
Aqui está um exemplo:
$ addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )
$ echo "${addrs[0]}" ## First IP
192.168.2.27
$ echo "${addrs[2]}" ## Second IP
192.168.1.1
$ echo "${#addrs[@]}" ## Number of IP addresses
37
Você também pode usar sed
:
addrs=( $(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*//p') )
Os endereços IP serão mostrados na primeira coluna, estamos extraindo a primeira coluna por [0-9][^ ]*
. ^[0-9]
aqui é para garantir que a linha comece com um numérico, então a primeira linha contendo o cabeçalho é descartada da saída.
Em uma nota diferente, se você tiver apenas uma entrada, poderá salvá-la em uma variável:
addr="$(arp -ni eth0 | grep -o '^[0-9][^ ]*')"
Ou
addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*//p')"