私はネットワークをスキャンするために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)
var1
今、(device1)を(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は同義語です)。