如何使用shell脚本提取列下的行

时间:2014-12-10 23:22:13

标签: shell string-formatting

我有以下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存储在某个数组中。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用cuttail。您可能需要调整数字:

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”时,您始终没有获得相同的列宽。