
Я использую 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 являются синонимами).