2016-03-11 3 views
0

Этот скрипт, несмотря на то, что он работает, занимает слишком много времени для выполнения в больших файлах из-за циклов while, но я не мог придумать более быстрый способ доступа к файлам. Любые предложения по улучшению его скорости, если приветствуются.Ошибка при работе с циклами

У меня есть такой список. Это как входной objFile выглядит следующим образом:

object-group network AES_PCH_CONGONHAL_CCEEP 
    network-object host 1.1.1.1 
    object-group network aes-LANTRONIX 
    description LANTRONIX 
    network-object object AES_PCH_CONGONHAL_CCEEP 
    network-object object AES_PCH_CONGONHAL_CCEER 

Это IP выглядит следующим образом:

1.1.1.1 
aes-LANTRONIX 

мне нужно искать для списка IP и вернуть все «объект-группу или„объект“ IP-адрес и полное содержимое каждого объекта. Например, IP 1.1.1.1. Вывод должен выглядеть следующим образом

object-group network AES_PCH_CONGONHAL_CCEEP 
network-object host 1.1.1.1 

Это может быть рекурсивным, имея объект внутри объекта, то `s почему есть массив для дальнейшего глядя

function findVar { 

    while read ip 
    do 
     local flag=0 
    while read objFile 
    do 
     if ! echo $objFile |grep -q -e '^object-group\|^object' 
     then 
     local allip+=" $objFile\n" 
      if echo $objFile | grep -q -e "$ip$\|$ip\ " 
      then 
      local objectNAME=$(echo $object | cut -d' ' -f3) 
      grep access-list $showrunn | grep -e "$objectNAME\|$ip " >> $acl 
      tempV+=("$objectNAME") 
      flag=1 
      fi 
     else 
     if [ $flag -eq 1 ] 
     then 
      echo $object 
      echo -e "$allip" 
      unset allip 
      flag=0 
     else 
      unset allip 
     fi 
     object=$(echo $objFile |grep -e '^object-group\|^object') 
     fi 
    done <<< "$(cat $1)" 
    done <<< "$(cat $2)" 
} 

num_words=${#tempV[@]} 
for i in "${!tempV[@]}"; do 
    findVar "$objBKP" "$var" 
done 
+2

Вы используете множество внешних программ, таких как 'cut' и' grep', когда 'bash' сам имеет встроенные инструменты, чтобы делать то же самое. Не проблема с производительностью, но вы используете '<<<', когда будет работать простая переадресация: 'while ...; do ... done <"$ 1" '. Учитывая, что ваша основная проблема заключается в том, что ваш код слишком медленный, я думаю, что это лучше подходит для codereview.stackexchange.com – chepner

+0

Вы говорите (я думаю), что вы можете искать хост, такой как '1.1.1.1', но также группы типа 'aes-LANTRONIX', это два разных типа объектов, как их можно обрабатывать одинаково? – miken32

+1

Если вы хотите скорость, bash - неправильный инструмент. Я бы выбрал perl. Если вам нужна быстрая оболочка на основе POSIX, используйте ksh93 –

ответ

1

gawk на помощь!

прототип решения для данной структуры может быть

$ gawk -v RS="object-group" '/1\.1\.1\.1/{print RT $0}' file 

object-group network AES_PCH_CONGONHAL_CCEEP 
    network-object host 1.1.1.1 

Я не уверен, я понимаю вашу вложенную структуру и то, что вы ожидаете, как выход в этом случае.

Обратите внимание, что вам нужен многосимвольный RS, который недоступен во всех awks.

+0

Обратите внимание, что вы хотите создать RS-сеть объектов-групп; это конфигурационный файл Cisco и существует несколько различных типов групп объектов. – miken32

+0

да, возможно, много других вещей, просто хотел добавить 'gawk' в качестве альтернативы тяжелым сценариям bash. – karakfa

Смежные вопросы