Come stampare un intervallo di indirizzi IP con il comando seq di Linux


8

Come posso stampare un intervallo di indirizzi IP sulla riga di comando di Linux usando il comando "seq"? Ad esempio: ho bisogno di seq per stampare un intervallo di ip da 10.0.0.1 a 10.0.0.23. Sembra che il periodo tra gli ottetti induca il numero a comportarsi come un punto mobile. Ricevo un "errore di argomento in virgola mobile non valido". Ho provato a usare l'opzione -f. Forse non lo sto usando correttamente. Ma mi ha ancora dato un errore. Sto provando a qualcosa di simile a

seq 10.0.0.2 10.0.0.23

Esiste un altro modo per stampare gli indirizzi IP in un intervallo in Linux diverso dal passare a Excel?


5
Con bash, quell'intervallo di indirizzi può essere stampato con echo 10.0.0.{2..23}. Il {..}costrutto si chiama espansione del controvento.
Giovanni 1024

Risposte:


22

Usa 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

Sfortunatamente questo non è ovvio in quanto a GNU non piace scrivere pagine man.


2
Penso che sarebbe meglio fare riferimento al manuale che forniscono piuttosto che notare che la pagina man in particolare è troppo breve. Vedere info coreutils 'seq invocation'.
Håkan Lindqvist,

1
@HåkanLindqvist Odio, assolutamente odio, informazioni GNU. E per non parlare del fatto che %gnon è nemmeno documentato lì; devi dare la caccia alla giusta printfpagina di informazioni.
Michael Hampton,

2
Assolutamente, anche fare riferimento man 3 printfè una buona idea nel caso in cui il lettore non abbia familiarità con le stringhe del formato printf. Detto questo, non sono un grande fan del loro uso di texinfo, ma questo era solo il mio suggerimento per migliorare la tua risposta facendo uso della documentazione che esiste semplicemente sottolineando la mancanza di documentazione in un formato specifico.
Håkan Lindqvist,

11

C'è l' pripsutilità che genera un elenco IP da un intervallo o CIDR. Utile per lavorare con grandi gamme:

$ 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

8

È possibile utilizzare il comando sed con seq per stampare l'intervallo di indirizzi IP.

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

O usando echo e tr

echo 10.0.0.{2..23} | tr ' ' '\n'

3

Il printfcomando esegue l'iterazione implicita se vengono forniti più argomenti rispetto agli identificatori di conversione. Per esempio:

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

Esistono due conversioni, ma sei argomenti. Quindi si verificano tre ripetizioni della logica di formattazione, marciando sugli argomenti in coppia.

Con ciò possiamo fare:

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

Il printfcomando e il suo comportamento ripetitivo sono standard POSIX : "L'operando del formato deve essere riutilizzato tutte le volte che è necessario per soddisfare gli operandi dell'argomento". D'altra parte, il seqcomando non lo è.


3
for i in $(seq 2 23); do echo "10.0.0.$i"; done

@don_crissti, perché?
user163009

"Perché" cosa?
don_crissti,

la modifica e il downvote?
user163009

Non sono il downvoter - molto probabilmente il sistema ha automaticamente declassato la tua risposta. L'ho solo rivisto (modificato). Per quanto riguarda perché modificare? Bene, perché è un codice e dovrebbe essere formattato correttamente.
don_crissti,

2

Se rimuoviamo il requisito per utilizzare il seqcomando e supponiamo che il ipcalccomando sia disponibile e il pripscomando Ubuntu non lo sia, allora pripspuò essere implementato come una funzione della 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}"
}

Si noti che questo includerà l'indirizzo di rete e l'indirizzo di trasmissione nell'intervallo; se questo è un problema, elimina il primo e l'ultimo indirizzo dal risultato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.