![如何在 awk 中迭代最后一个 IP 八位字节?](https://linux22.com/image/111091/%E5%A6%82%E4%BD%95%E5%9C%A8%20awk%20%E4%B8%AD%E8%BF%AD%E4%BB%A3%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%20IP%20%E5%85%AB%E4%BD%8D%E5%AD%97%E8%8A%82%EF%BC%9F.png)
我想知道,是否可以使用 迭代最后一个 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
)。