Como imprimir um intervalo de endereços IP com o comando Linux seq

8

Como posso imprimir um intervalo de endereços IP na linha de comando do Linux usando o comando "seq"? Por exemplo: Eu preciso de seq para imprimir um intervalo de ip de 10.0.0.1 a 10.0.0.23. Parece que o período entre os octetos faz com que o número se comporte como um ponto flutuante. Estou recebendo um "erro de argumento de ponto flutuante inválido". Eu tentei usar a opção -f. Pode ser que eu não esteja usando corretamente. Mas ainda me deu um erro. Eu estou tentando algo parecido com

seq 10.0.0.2 10.0.0.23

Existe outra maneira de imprimir endereços IP em um intervalo no Linux diferente de alternar para o Excel?

    
por user2476714 20.11.2014 / 07:58

6 respostas

18

Use um formato:

$ seq -f "10.20.30.%g" 40 50
10.20.30.40
10.20.30.41
10.20.30.42
10.20.30.43
10.20.30.44
10.20.30.45
10.20.30.46
10.20.30.47
10.20.30.48
10.20.30.49
10.20.30.50

Infelizmente, isso não é óbvio, já que o GNU não gosta de escrever páginas de manual.

    
por 20.11.2014 / 08:03
10

Existe o prips utility que gera uma lista de IPs a partir de um intervalo ou CIDR. Útil para o trabalho com grandes intervalos:

$ prips 10.0.0.20 10.0.0.23
10.0.0.20
10.0.0.21
10.0.0.22
10.0.0.23

$ prips 10.0.0.0/23
10.0.0.0
10.0.0.1
10.0.0.2
<...>
10.0.1.254
10.0.1.255
    
por 02.07.2015 / 14:18
7

Você pode usar o comando sed com seq para imprimir o intervalo de endereço IP.

seq 2 23 | sed 's/^/10.0.0./'

OU usando echo e tr

echo 10.0.0.{2..23} | tr ' ' '\n'
    
por 20.11.2014 / 08:03
2

O comando printf executa a iteração implícita se receber mais argumentos que os especificadores de conversão. Por exemplo:

$ printf "%s-%s\n" 1 2 3 4 5 6
1-2
3-4
5-6

Existem duas conversões, mas seis argumentos. Então, três repetições da lógica de formatação ocorrem, marcando os argumentos em pares.

Com isso, podemos fazer:

printf "10.0.0.%s\n" $(seq 1 23)

O comando printf e seu comportamento repetitivo são padrão POSIX : "O operando de formato deve ser reutilizado quantas vezes forem necessárias para satisfazer os operandos de argumento." Por outro lado, o comando seq não é.

    
por 02.07.2015 / 16:53
0
for i in $(seq 2 23); do echo "10.0.0.$i"; done
    
por 27.03.2016 / 14:49
0

Se removermos o requisito de usar o comando seq e assumirmos que o comando ipcalc está disponível e o comando% prips do Ubuntu não estiver, então prips pode ser implementado como uma função do shell Bash:

prips() {
  cidr=$1

  # range is bounded by network (-n) & broadcast (-b) addresses.
  lo=$(ipcalc -n $cidr |cut -f2 -d=)
  hi=$(ipcalc -b $cidr |cut -f2 -d=)

  read a b c d <<< $(echo $lo |tr . ' ')
  read e f g h <<< $(echo $hi |tr . ' ')

  eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}"
}

Observe que isso incluirá o endereço de rede e o endereço de broadcast no intervalo; se isso for um problema, exclua o primeiro e o último endereço do resultado.

    
por 16.05.2017 / 14:15