
Ich verwende nmap, um mein Netzwerk zu scannen und möchte jedes aktive Gerät anzeigen. Folgendes funktioniert hervorragend:
ips=$(nmap -sn 192.168.1.68/24 -oG - | awk '/Up$/{print $2, $3}')
Was ich jetzt tun möchte, ist, jede Ausgabe in einer separaten Variable zu speichern.
Nehmen wir an, ips
es ergibt sich diese Ausgabe:
$ echo "$ips"
xxx.xxx.x.1 (device1)
xxx.xxx.x.2 (device2)
xxx.xxx.x.3 (device3)
var1
Ich möchte nun (Gerät1) in , (Gerät2) in var2
und (Gerät3) in speichern.var3
Wie könnte ich das tun?
Antwort1
Erstellen Sie nicht eine Reihe separater Skalarvariablen, sondern speichern Sie die Befehlsausgabe einfach in einem Array statt in einer Skalarvariablen. Anschließend können Sie darauf als ips[0]
, ips[1]
, usw. zugreifen. Verwenden Sie der Einfachheit printf
halber anstelle Ihrer aktuellen nmap | awk
Pipeline, um Ihre genaue Befehlsausgabe zu reproduzieren:
$ 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)")
Sehenhttps://stackoverflow.com/a/32931403/1745001für weitere Einzelheiten zum obigen Ansatz zum Speichern der Befehlsausgabe in einem Array im Vergleich zu anderen Ansätzen (readarray und mapfile sind Synonyme).