Como iterar no último octeto IP no awk?

1

Eu estou querendo saber, é possível iterar sobre o último octeto IP com awk , assumindo que o IP é uma variável recebida do bash stdin, algo como:

#!/bin/bash
read IP

awk -v IP="${IP}"  'BEGIN{FS="."} {for (i=1; i<=251; i++) { print $1 $2 $3 i } }'

E a saída será como:

192.168.1.1
192.168.1.2
....
192.168.1.251

Note que isso não funcionará, mas espero que você entenda.

    
por fugitive 08.05.2017 / 23:19

1 resposta

3
printf '192.168.1.%d\n' {1..251}

Isso usará a expansão de chave de bash (originalmente um recurso zsh , também disponível em ksh93 ) para gerar números entre 1 e 251 e para cada número o printf imprimirá um endereço IP com o número inserido no final.

O seguinte seria ler um endereço IP e fazer o mesmo com isso:

IFS='.' read a1 a2 a3 a4
printf -- "$a1.$a2.$a3.%d\n" {1..251}

Se você quisesse usar awk :

awk 'BEGIN { OFS = FS = "." } { for (i = 1; i <= 251; ++i) print $1, $2, $3, i }' <<<"$IP"

Queremos que o delimitador de campo de entrada e saída seja um ponto, por isso, definimos FS e OFS para esse caractere em um bloco BEGIN . Em seguida, lemos os endereços IP da entrada padrão e, para cada endereço IP, iteramos de 1 a 251 e imprimimos a lista.

Na linha de comando, alimentamos $IP como "string aqui" (originalmente um recurso de zsh , mas também disponível em bash e ksh93 ).

    
por 08.05.2017 / 23:24