说明:
我有一个简单的运行任何 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.12
从eth0和${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
这假定eth0
和lo
接口的顺序,但它显示了基本的想法。
你可以使用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)