
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 ips
damos 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 var2
y (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 printf
en lugar de su canal actual nmap | awk
para 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).