나는 네트워크를 스캔하기 위해 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은 동의어입니다).