2014-12-10 2 views
0

У меня есть следующий вывод команды linux brctl show. Я хотел бы извлечь все связанные интерфейсы (как указано в столбце интерфейса) и сохранить их в некотором массиве. Может ли кто-нибудь предложить способ добиться этого?Как извлечь строки под столбцом с помощью сценария оболочки

[email protected]:~# brctl show 
bridge name bridge id   STP enabled interfaces 
br-lan  7fff.00c0ca7e0288 no   eth0 
              wlan1_1 
              wlan1_1.sta1 

По какой-то причине у меня нет точного форматирования. Но выход brctl-шоу выглядит так же, как и выше, за исключением нескольких интервалов.

Поэтому я хотел бы хранить eth0, wlan1_1, w; an1_1.sta1 в некотором массиве, если это возможно.

Благодаря

ответ

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 
+0

Это дает мне кое-что для начала. Хотя чтение второй строки все еще проблематично, а также есть разница в количестве символов в строках 2, 3 и 4. Например [brctl show | хвост -n +3 | cut -c 8-] отлично работает для строк 3 и 4. Но не для строки 2. Спасибо за ваш ответ. – user27396

+0

Это странно. Я использовал «brctl show» здесь (не имел интерфейсов), поэтому мне пришлось отбросить 1-ю строку. Там было '36'' интерфейсов' из-за символов 'tab', разделяющих заголовки. Затем я скопировал ваш вывод в текстовый файл и протестировал его. Затем колонка, которую вы хотели, начиналась с '46' из-за пробелов, предшествующих всем интерфейсам. Если 'brctl' делает что-то странное, как« смешивание вкладок и пробелов »на выходе, вам просто нужно будет сыграть с ним. Альтернативой является цикл while while -r line с проверками на линии, чтобы определить, есть ли текст в символах '1-> x', чтобы сделать что-то одно, а другое сделать другое. –

+0

Попробуйте решение 'bash script', которое я разместил. Как уже отмечалось, я тестировал ваши данные в текстовом файле, но команда 'brctl show' должна работать одинаково из-за использованных тестов. –

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 шоу" вы Бесполезным t t получить одинаковые ширины столбцов все время.