Этот скрипт, несмотря на то, что он работает, занимает слишком много времени для выполнения в больших файлах из-за циклов 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
Вы используете множество внешних программ, таких как 'cut' и' grep', когда 'bash' сам имеет встроенные инструменты, чтобы делать то же самое. Не проблема с производительностью, но вы используете '<<<', когда будет работать простая переадресация: 'while ...; do ... done <"$ 1" '. Учитывая, что ваша основная проблема заключается в том, что ваш код слишком медленный, я думаю, что это лучше подходит для codereview.stackexchange.com – chepner
Вы говорите (я думаю), что вы можете искать хост, такой как '1.1.1.1', но также группы типа 'aes-LANTRONIX', это два разных типа объектов, как их можно обрабатывать одинаково? – miken32
Если вы хотите скорость, bash - неправильный инструмент. Я бы выбрал perl. Если вам нужна быстрая оболочка на основе POSIX, используйте ksh93 –