Explanation:I have a small bash script which simply runs any Linux command (e.g. say ifconfig)The typical output of ifconfig is something like this:eth0      Link encap:Ethernet  HWaddr 30:F7:0D:6D:34:CA          inet addr:10.106.145.12  Bcast:10.106.145.255  Mask:255.255.255.0          inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0          TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000          RX bytes:444437904 (423.8 MiB)  TX bytes:238380 (232.7 KiB)lo        Link encap:Local Loopback           inet addr:127.0.0.1  Mask:255.255.0.0          inet6 addr: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:16436  Metric:1          RX packets:15900 errors:0 dropped:0 overruns:0 frame:0          TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0          RX bytes:467306 (456.3 KiB)  TX bytes:467306 (456.3 KiB)Now what most people usually do is store the entire output into a file/variable and parse based on that. I however want to know if there is anyway that I could put specific parts of the output in more than one variable (say a bash variable called ${IPETH0} to carry the IP address 10.106.145.12 from eth0 and ${IPLO} to carry the IP address 127.0.0.1 from lo in the above example without running ifconfig command twice).Something like what tee command does with the input but I want to do this for the output and store the output into 2 or more variables in one go. Any ideas?
Capture output of a bash command, parse it and store into different bash variables
linux;bash;shell;scripting
Got the answer:$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }' | cut -d ':' -f 2)$ echo ${IPETH0}192.168.23.2$ echo ${IPLO}127.0.0.1This assumes the order of the eth0 and lo interfaces, but it shows the basic idea.Pure awkYou can do this exclusively in awk using the split function:$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { split($2,a,:); print a[2]}')