назначить вывод nmap нескольким переменным

назначить вывод nmap нескольким переменным

Я использую nmap для сканирования своей сети и хочу показать каждое работающее устройство. Следующее работает отлично:

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

Теперь я хочу сохранить каждый вывод в отдельной переменной.

Допустим, мы ipsполучим такой вывод:

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

Теперь я хочу сохранить (device1) в var1,(device2) в var2и (device3) вvar3

Как я мог это сделать?

решение1

Не создавайте кучу отдельных скалярных переменных, просто сохраните вывод команды в массиве вместо скалярной переменной, и тогда вы сможете получить к нему доступ как ips[0], ips[1]и т. д. Используйте printfвместо текущего nmap | awkконвейера для простоты, чтобы воспроизвести точный вывод вашей команды:

$ 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)")

Видетьhttps://stackoverflow.com/a/32931403/1745001для получения более подробной информации о приведенном выше подходе к сохранению вывода команды в массиве в сравнении с другими подходами (readarray и mapfile являются синонимами).

Связанный контент