如何在 awk 中迭代最后一个 IP 八位字节?

如何在 awk 中迭代最后一个 IP 八位字节?

我想知道,是否可以使用 迭代最后一个 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)。

相关内容