Cómo imprimir un rango de direcciones IP con el comando seq de Linux

8

¿Cómo puedo imprimir un rango de direcciones IP en la línea de comando de Linux usando el comando "seq"? Por ejemplo: necesito seq para imprimir un rango de ip de 10.0.0.1 a 10.0.0.23. Parece que el período entre los octetos hace que el número se comporte como un punto flotante. Recibo un "error de argumento de coma flotante no válido". Intenté usar la opción -f. Puede ser que no lo estoy usando correctamente. Pero aún así me dio un error. Estoy intentando algo similar a

seq 10.0.0.2 10.0.0.23

¿Hay otra forma de imprimir direcciones IP en un rango en Linux que no sea cambiar a Excel?

usuario2476714
fuente
55
Con bashese rango de direcciones se puede imprimir con echo 10.0.0.{2..23}. La {..}construcción se llama expansión de llaves.
John1024

Respuestas:

22

Use un 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

Desafortunadamente, esto no es obvio ya que a GNU no le gusta escribir páginas de manual.

Michael Hampton
fuente
2
Creo que sería mejor hacer referencia al manual que proporcionan que solo señalar que la página de manual específicamente es demasiado breve. Ver info coreutils 'seq invocation'.
Håkan Lindqvist
1
@ HåkanLindqvist Odio, odio absolutamente, la información de GNU. Y sin mencionar que %gtampoco está documentado allí; tienes que buscar la printfpágina de información correcta .
Michael Hampton
2
Absolutamente, hacer referencia man 3 printftambién es una buena idea en caso de que el lector no esté familiarizado con las cadenas de formato printf. Dicho esto, tampoco soy un gran admirador de su uso de texinfo, pero esta fue solo mi sugerencia para mejorar su respuesta haciendo uso de la documentación que existe más que señalar la falta de documentación en un formato específico.
Håkan Lindqvist
11

Existe la pripsutilidad que genera una lista de IP desde un rango o CIDR. Útil para trabajar con grandes rangos:

$ 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
usuario4151603
fuente
8

Puede usar el comando sed con seq para imprimir el rango de la dirección IP.

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

O usando echo y tr

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

El printfcomando realiza una iteración implícita si recibe más argumentos que los especificadores de conversión. Por ejemplo:

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

Hay dos conversiones, pero seis argumentos. Entonces ocurren tres repeticiones de la lógica de formato, marchando sobre los argumentos por pares.

Con eso podemos hacer:

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

El printfcomando y su comportamiento repetitivo son estándar POSIX : "El operando de formato se reutilizará con la frecuencia necesaria para satisfacer los operandos del argumento". Por otro lado, el seqcomando no lo es.

Kaz
fuente
3
for i in $(seq 2 23); do echo "10.0.0.$i"; done
user163009
fuente
@don_crissti, ¿por qué?
user163009
"¿Por qué?"
don_crissti
la edición y downvote?
user163009
No soy el votante negativo: lo más probable es que el sistema haya votado automáticamente su respuesta. Solo lo revisé (lo edité). ¿Por qué editar? Bueno, porque es código y debe estar formateado correctamente.
don_crissti
2

Si eliminamos el requisito de usar el seqcomando, y suponemos que el ipcalccomando está disponible, y el pripscomando Ubuntu no lo está, entonces pripsse puede implementar como una función de 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}"
}

Tenga en cuenta que esto incluirá la dirección de red y la dirección de difusión en el rango; Si eso es un problema, elimine la primera y la última dirección del resultado.

Alex Harvey
fuente