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