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

8

Como posso imprimir um intervalo de endereços IP na linha de comando linux usando o comando "seq"? Por exemplo: eu preciso do 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 assim me deu um erro. 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 que não seja a mudança para o Excel?

user2476714
fonte
5
Com bash, esse intervalo de endereços pode ser impresso com echo 10.0.0.{2..23}. A {..}construção é chamada de expansão entre chaves.
John1024

Respostas:

22

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, pois o GNU não gosta de escrever páginas de manual.

Michael Hampton
fonte
2
Eu acho que seria melhor fazer referência ao manual que eles fornecem do que apenas notar que a página de manual especificamente é excessivamente breve. Veja info coreutils 'seq invocation'.
Håkan Lindqvist
1
@ HåkanLindqvist Eu odeio, absolutamente odeio, informações do GNU. E para não mencionar que %gtambém não está documentado; você precisa procurar a printfpágina de informações correta .
Michael Hampton
2
Absolutamente, fazer referência man 3 printftambém é uma boa idéia, caso o leitor não esteja familiarizado com as seqüências de caracteres de formato printf. Dito isto, também não sou muito fã do uso do texinfo, mas essa foi apenas minha sugestão para melhorar sua resposta, fazendo uso da documentação que existe, apenas apontando a falta de documentação em um formato específico.
Håkan Lindqvist
11

Existe o pripsutilitário que gera uma lista de IPs de um intervalo ou CIDR. Útil para trabalhos com grandes faixas:

$ 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
user4151603
fonte
8

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

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

OU usando eco e tr

echo 10.0.0.{2..23} | tr ' ' '\n'
Vaibhav Panmand
fonte
3

O printfcomando executa iteração implícita se receber mais argumentos do que especificadores de conversão. Por exemplo:

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

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

Com isso, podemos fazer:

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

O printfcomando e seu comportamento repetitivo são o padrão POSIX : "O operando formatado deve ser reutilizado quantas vezes for necessário para satisfazer os operandos do argumento". Por outro lado, o seqcomando não é.

Kaz
fonte
3
for i in $(seq 2 23); do echo "10.0.0.$i"; done
user163009
fonte
@don_crissti, por quê?
user163009
"Por que" o que?
31516 don_crissti
a edição e voto negativo?
user163009
Não sou a favor do voto negativo - provavelmente o sistema votou automaticamente na sua resposta. Eu apenas revi (editei). Por que editar? Bem, porque é um código e deve ser formatado corretamente.
31516 don_crissti
2

Se removermos o requisito de usar o seqcomando e presumirmos que o ipcalccomando está disponível e o pripscomando Ubuntu não, então pripspode 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.

Alex Harvey
fonte