asignar salida de nmap a varias variables

asignar salida de nmap a varias variables

Estoy usando nmap para escanear mi red y quiero mostrar todos los dispositivos que están activos. Lo siguiente funciona muy bien:

ips=$(nmap -sn 192.168.1.68/24 -oG - | awk '/Up$/{print $2, $3}')

Lo que ahora quiero es guardar cada salida en una variable separada.

Digamos que ipsdamos este resultado:

$ echo "$ips"
xxx.xxx.x.1 (device1)
xxx.xxx.x.2 (device2)
xxx.xxx.x.3 (device3)

Ahora quiero guardar (dispositivo1) en var1, (dispositivo2) en var2y (dispositivo3) envar3

¿Cómo podría hacer eso?

Respuesta1

No cree un montón de variables escalares separadas, simplemente guarde la salida del comando en una matriz en lugar de una variable escalar y luego podrá acceder a ella como ips[0], ips[1]etc. Use printfen lugar de su canal actual nmap | awkpara simplificar la reproducción de su salida exacta del comando:

$ printf 'xxx.xxx.x.1 (device1)\nxxx.xxx.x.2 (device2)\nxxx.xxx.x.3 (device3)\n'
xxx.xxx.x.1 (device1)
xxx.xxx.x.2 (device2)
xxx.xxx.x.3 (device3)

$ ips=$(printf 'xxx.xxx.x.1 (device1)\nxxx.xxx.x.2 (device2)\nxxx.xxx.x.3 (device3)\n')

$ echo "$ips"
xxx.xxx.x.1 (device1)
xxx.xxx.x.2 (device2)
xxx.xxx.x.3 (device3)

$ readarray -t -d $'\n' ips < <(printf 'xxx.xxx.x.1 (device1)\nxxx.xxx.x.2 (device2)\nxxx.xxx.x.3 (device3)\n')

$ declare -p ips
declare -a ips=([0]="xxx.xxx.x.1 (device1)" [1]="xxx.xxx.x.2 (device2)" [2]="xxx.xxx.x.3 (device3)")

Verhttps://stackoverflow.com/a/32931403/1745001para obtener más detalles sobre el enfoque anterior para guardar la salida del comando en una matriz frente a otros enfoques (readarray y mapfile son sinónimos).

información relacionada