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