我有以下linux命令brctl show的输出。我想提取所有相关的接口(如接口列中给出的)并将其存储在某个数组中。有人可以建议一种方法来实现这个目标吗?
root@XXXX:~# brctl show
bridge name bridge id STP enabled interfaces
br-lan 7fff.00c0ca7e0288 no eth0
wlan1_1
wlan1_1.sta1
由于某种原因,我错过了确切的格式。但是除了几个间距之外,brctl show的输出看起来非常像上面那样。
所以我想在可能的情况下将eth0,wlan1_1,w; an1_1.sta1存储在某个数组中。
由于
答案 0 :(得分:1)
您可以使用cut
和tail
。您可能需要调整数字:
brctl show | tail -n +2 | cut -c 36-
如果tab
个字符在输出中转换为空格,则需要:
brctl show | tail -n +2 | cut -c 46-
Bash脚本解决方案
注意:我使用您的数据的数据文件进行了测试,但它也应该与brctl show
输出一起使用:
#!/bin/bash
declare -i cnt=0
declare -a ifaces
while read -r line || [ -n "$line" ]; do
[ $cnt -eq 0 ] && { ((cnt++)); continue; }
ifaces+=( "${line//* /}" )
done <<<$(brctl show)
printf "%s\n" ${ifaces[@]}
以done <"$1"
作为替代进行测试:
$ bash brctl.sh dat/brctl.txt
eth0
wlan1_1
wlan1_1.sta1
答案 1 :(得分:0)
Shell脚本解决方案,更兼容,故障可能性更小:
#!/bin/sh
BridgeMembers ()
{
local TheBridge="$1"
local CurrentLine=""
local CurrentMac=""
local CurrentNIC=""
IFS="$(printf "\n\b")" ; for CurrentLine in $(brctl showmacs "$TheBridge" | tail -n +2) ; do unset IFS
IsLocal="$(OneWord () { echo $3; }; OneWord $CurrentLine)"
if [ "$IsLocal" = "yes" ] ; then
CurrentMac="$(OneWord () { echo $2; }; OneWord $CurrentLine)"
CurrentNic="$(env LANG=en ifconfig | grep -e $CurrentMac)"
CurrentNic="$(OneWord () { echo $1; }; OneWord $CurrentNic)"
echo "$CurrentNic"
fi
done
}
BridgeMembers "$1"
请注意,使用“brctl show”时,您始终没有获得相同的列宽。