根据不同的模式从bash数组中删除多个元素

时间:2015-08-31 04:37:40

标签: arrays bash awk

所以我有这个:

INTERFACES=($(ip -o link show | awk -F': ' '{print $2}'))

给我一​​个接口数组,但是我想从数组中删除loopback和tun适配器。

INTERFACES=(${INTERFACES[@]/lo/})
INTERFACES=(${INTERFACES[@]/tun*/})

有效,但有没有办法在一行中完成这项工作?

可能超级容易和derp,但我想了解表达式实际上是如何工作的(谷歌给了我47239432以上的例子,但没有解释它是如何工作的或者给出了一次使用多个表达式的例子)。

我知道这可以使用awk命令完成,所以使用awk和使用数组过滤器的解决方案都会受到极大的赞赏:)

如果这是一个愚蠢的问题,我道歉。

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。一个例子:

# arr=(lo tun0 net1 net2)
# echo ${arr[@]}
lo tun0 net1 net2
# arr=( $( printf '%s\n' ${arr[@]} | egrep -v '^(lo|tun)' ) )
# echo ${arr[@]}
net1 net2
#

您也可以在一开始就排除这些界面:

INTERFACES=( $(ip -o link show | awk -F': ' '$2 !~ /^(lo|tun)/ {print $2}') )