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?
Here are the different ways to store the output of a command in shell script. You can also use these commands on terminal to store command outputs in shell variables. variable_name=$(command) variable_name=$(command [option ...] arg1 arg2 ...) OR variable_name=`command` variable_name=`command [option ...]
$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }')
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1
This assumes the order of the eth0
and lo
interfaces, but it shows the basic idea.
You can use awk and bash arrays:
arr=( $(awk -F ':' '$1 == "inet addr"{sub(/ .*/, "", $2); print $2}' < <(ifconfig)) )
Then you can do:
read IPETH0 IPLO <<< ${arr[@]}
you can read each line of ifconfig and set variables :
while read l1 ;do
if [[ $l1 =~ inet ]];then
set -- $l1
echo "ip is $2 "
fi
done < <(ifconfig)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With