我想知道,是否可以使用 迭代最后一个 IP 八位字节awk
,假设 IP 是从 bash stdin 接收的变量,如下所示:
#!/bin/bash
read IP
awk -v IP="${IP}" 'BEGIN{FS="."} {for (i=1; i<=251; i++) { print $1 $2 $3 i } }'
输出将类似于:
192.168.1.1
192.168.1.2
....
192.168.1.251
请注意,这行不通,但我希望你能明白。
答案1
printf '192.168.1.%d\n' {1..251}
这将使用大括号扩展bash
(最初是一个zsh
功能,也可在 中使用ksh93
)来生成 1 到 251 之间的数字,并且对于每个数字,printf
将打印一个 IP 地址,并在末尾插入数字。
以下代码将读取 IP 地址并对其执行相同的操作:
IFS='.' read a1 a2 a3 a4
printf -- "$a1.$a2.$a3.%d\n" {1..251}
如果您想使用awk
:
awk 'BEGIN { OFS = FS = "." } { for (i = 1; i <= 251; ++i) print $1, $2, $3, i }' <<<"$IP"
我们希望输入和输出字段分隔符都是点,因此我们将 和 设置FS
为块OFS
中的该字符BEGIN
。然后我们从标准输入读取 IP 地址,对于每个 IP 地址,我们从 1 迭代到 251 并打印出列表。
在命令行上,我们$IP
以“here-string”的形式输入(最初是 的一个功能zsh
,但也可以在bash
和中使用ksh93
)。