我正在使用 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 是同义词)。