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 は同義語です) の詳細について。

関連情報