庆典 - for循环IP范围排除某些IP地址(bash - for loop for IP ran

2019-10-23 09:00发布

我有下面的for循环

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

我要排除这种iprange: 10.11.{32..35}.{39..61}从上面的for循环。 这个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

Answer 1:

尝试这个:

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


Answer 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


文章来源: bash - for loop for IP range excluding certain IPs