捕获bash命令的输出,parsing并存储到不同的bashvariables中

说明:

我有一个简单的运行任何 Linux命令的小bash脚本(例如ifconfig

ifconfig的典型输出是这样的:

 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) 

现在大多数人通常所做的就是将整个输出存储到一个文件/variables中,并基于此进行parsing。 然而,我想知道是否可以将输出的特定部分放在多个variables中(比如一个名为${IPETH0}bashvariables, 10.106.145.12eth0${IPLO}携带IP地址10.106.145.12在上面的示例中,来自lo的IP地址127.0.0.1 而不运行ifconfig命令两次 )。

就像tee命令一样对input进行操作,但是我希望对输出执行此操作,并将输出存储到2个或更多个variables中。 有任何想法吗?

 $ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }') $ echo "${IPETH0}" 192.168.23.2 $ echo "${IPLO}" 127.0.0.1 

这假定eth0lo接口的顺序,但它显示了基本的想法。

你可以使用awk和bash数组:

 arr=( $(awk -F ':' '$1 == "inet addr"{sub(/ .*/, "", $2); print $2}' < <(ifconfig)) ) 

那你可以这样做:

 read IPETH0 IPLO <<< ${arr[@]} 

你可以阅读ifconfig和设置变量的每一行:

 while read l1 ;do if [[ $l1 =~ inet ]];then set -- $l1 echo "ip is $2 " fi done < <(ifconfig)