2015-06-12 2 views
1

У меня есть ниже петлиБаш - цикл для диапазона IP за исключением определенных IP-адресов

for ip in 10.11.{32..47}.{0..255} 
do 
     echo "<ip>${ip}</ip>" 
done 

Я хочу, чтобы исключить это IPRange: 10.11.{32..35}.{39..61} из выше для цикла. Этот интервал ip является подмножеством вышеприведенного. Есть ли способ сделать это?

Я попробовал это, это не работает:

abc=10.11.{34..37}.{39..61} 
for ip in 10.11.{32..47}.{0..255} 
do 
    if [[ $ip == $abc ]] 
    then 
      echo "not_defined" 
    else 
      echo "<ip>${ip}</ip>" 
    fi 
done 
+0

вы спрашиваете, если вы можете получить расширение скобки, чтобы сделать это для вас или вы спрашиваете, как писать логику в цикле, чтобы исключить эти диапазоны? –

ответ

6

Попробуйте это:

for ip in 10.11.{32..47}.{0..255} 
do 
     echo 10.11.{32..35}.{39..61} | grep -q "\<$ip\>" && continue 
     echo "<ip>${ip}</ip>" 
done 

Это, конечно, это простое решение, которое до сих пор петли через комплект и выбрасывают некоторые нежелательные элементы. Как показывает ваш комментарий, это может привести к ненужным задержкам во время пропущенных частей. Чтобы избежать этого, вы можете генерировать значения параллельно с обработкой, как это:

for ip in 10.11.{32..47}.{0..255} 
do 
     echo 10.11.{32..35}.{39..61} | grep -q "\<$ip\>" && continue 
     echo "${ip}" 
done | while read ip 
do 
     process "$ip" 
done 

Если process "$ip" принимает по крайней мере, минимальное количество времени, то время для генерации значений, скорее всего, не больше учитываются.

Если вы хотите полностью пропустить значения, вы также можете использовать более сложный термин для своих IP-адресов (но тогда уже не будет ясно, как этот код был получен из спецификации, которую вы дали в своем вопросе, поэтому я лучше комментирую он тщательно):

# ranges below result in 
# 10.11.{32..47}.{0..255} without 10.11.{32..35}.{39..61}: 
for ip in 10.11.{32..35}.{{0..38},{62..255}} 10.11.{36..47}.{0..255} 
do 
     echo "${ip}" 
done 
+0

Это замечательный Alfe, но мы все еще зацикливаемся через ip-диапазон 10.11. {32..35}. {39..61} (который мы хотели исключить), но не печатать вывод. Пожалуйста, исправьте меня, если я ошибаюсь. Я планировал добавить условие «если» внутри «for loop», чтобы исключить ip-диапазон 10.11. {32..35}. {39..61}. У меня есть куча других команд, которые должны быть включены внутри цикла for, а не только эха. Я планирую сохранить Тим e, не ударяя этот ip-диапазон, просто не печатать вывод не поможет. – spacemtn5

+0

Обычно все, что вы делаете в этих циклах, займет гораздо больше времени, чем сам цикл, но я вижу вашу точку зрения и сделаю все возможное, чтобы решить эту проблему. Будьте на связи. – Alfe

+0

Добавлены еще несколько версий. – Alfe

2

Попробуйте это:

printf "%s\n" 10.11.{32..47}.{0..255} 10.11.{32..35}.{39..61} | sort | uniq -u | while read ip; do echo $ip; done 
+0

К сожалению, это ничего не устранит. Вместо этого вы можете попробовать что-то вроде этого: '... | сортировать | uniq -c | awk '$ 1 = 1 {print $ 2}' | ... ' –

+0

@SatoKatsura: Невозможно воспроизвести это с помощью версии bash 4.3.11. 'printf' создать 4188 строк и' | сортировать | uniq -u' уменьшит его до 4004 строк. – Cyrus

+1

Ах, извините, ошибка пилота. :( –

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