首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不包括某些IP的网段的bash - for循环

不包括某些IP的网段的bash - for循环
EN

Stack Overflow用户
提问于 2015-06-13 05:09:00
回答 2查看 14.1K关注 0票数 2

我有下面的for循环

代码语言:javascript
复制
for ip in 10.11.{32..47}.{0..255}
do
        echo "<ip>${ip}</ip>" 
done

我想从上面的for循环中排除这个iprange:10.11.{32..35}.{39..61}。此网段是上述网段的子集。有没有办法做到这一点?

我试过了,这不管用:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-13 05:23:20

试试这个:

代码语言:javascript
复制
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

当然,这是一个简单的解决方案,它仍然循环遍历整个集合,并丢弃一些不需要的元素。正如您的评论所暗示的那样,这可能会在跳过的部分期间产生不必要的延迟。为了避免这些问题,您可以在处理过程中并行生成值,如下所示:

代码语言:javascript
复制
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"至少占用了最少的时间,那么很可能不会再考虑生成值的时间。

如果你想完全跳过这些值,你也可以用一个更复杂的术语来表示你的I(但这样就不清楚这段代码是如何从你的问题中给出的规范中派生出来的,所以我最好对它进行彻底的注释):

代码语言:javascript
复制
# 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
票数 8
EN

Stack Overflow用户

发布于 2015-06-13 05:15:51

试试这个:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30812197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档