【发布时间】:2021-03-11 22:37:17
【问题描述】:
当使用 seq 生成 IP 地址时,我使用 seq 0 255 并生成最后一个八位字节。我该如何转换它以便生成所有其他八位字节及其可能的组合(超过 400 万个组合)。任何帮助开始将不胜感激
【问题讨论】:
-
我建议使用
awk四个循环。 -
如果时间问题,我建议使用
C。
当使用 seq 生成 IP 地址时,我使用 seq 0 255 并生成最后一个八位字节。我该如何转换它以便生成所有其他八位字节及其可能的组合(超过 400 万个组合)。任何帮助开始将不胜感激
【问题讨论】:
awk 四个循环。
C。
如果您正在寻找bash 解决方案:
for h in {1..255}; do for i in {1..255}; do for j in {1..255}; do for k in {1..255}; do echo "$h.$i.$j.$k"; done; done; done; done
或者多行版本
for h in {1..255}
do for i in {1..255}
do for j in {1..255}
do for k in {1..255}
do echo "$h.$i.$j.$k"
done
done
done
done
或者如果你真的打算使用 seq
for h in `seq 255`; do for i in `seq 255`; do for j in `seq 255`; do for k in `seq 255`; do echo "$h.$i.$j.$k"; done; done; done; done
【讨论】:
带有awk 和四个循环:
awk 'BEGIN{OFS="."; for(h=0;h<256;h++){for(i=0;i<256;i++){for(j=0;j<256;j++){for(k=0;k<256;k++){print h,i,j,k}}}}}'
带有C 和四个循环:
把这个文件命名为ipgen.c:
#include <stdio.h>
int main() {
int h, i, j, k;
for (h = 0; h < 256; h++) {
for (i = 0; i < 256; i++) {
for (j = 0; j < 256; j++) {
for (k = 0; k < 256; k++) {
printf("%d.%d.%d.%d\n", h, i, j, k);
}
}
}
}
return 0;
}
编译:gcc ipgen.c -o ipgen
开始吧:./ipgen
【讨论】:
为了速度,我会投票支持 4 路 awk/for 循环(根据 Cyrus 的评论),但我想我会看一下递归函数:
tuple () {
local level=$1 # number of tuples to generate
local max=$2 # assume tuples are numbered 1 to max
local in=$3 # current tuple from parent
local pfx="." # for all but the topmost call we append a period on the front of our loop counter
[[ -z "${in}" ]] && pfx="" # topmost call appends no prefix
local i
local out
for (( i=1 ; i<=${max} ; i++ ))
do
out="${in}${pfx}${i}"
if [[ "${level}" -eq 1 ]] # if we've reached the bottom of our function calls
then
echo "${out}" # print our latest string
else
tuple $((level-1)) "${max}" "${out}" # otherwise recurse with the latest string
fi
done
}
构建一个值范围为 1 到 2 的 3 元组:
$ tuple 3 2
1.1.1
1.1.2
1.2.1
1.2.2
2.1.1
2.1.2
2.2.1
2.2.2
构建一个 3 元组,其值范围为 1 到 4:
$ tuple 3 4
1.1.1
1.1.2
1.1.3
1.1.4
1.2.1
...
4.3.4
4.4.1
4.4.2
4.4.3
4.4.4
构建一个值从 1 到 255 的 4 元组(请记住,这不会会很快,因为我们正在制作 LOT 的 bash级调用):
$ tuple 4 255
1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.4
1.1.1.5
1.1.1.6
1.1.1.7
1.1.1.8
1.1.1.9
1.1.1.10
... if you let it run long enough ...
255.255.255.250
255.255.255.251
255.255.255.252
255.255.255.253
255.255.255.254
255.255.255.255
【讨论】: