So drucken Sie einen Bereich von IP-Adressen mit dem Linux-Befehl seq


8

Wie kann ich mit dem Befehl "seq" einen Bereich von IP-Adressen in der Linux-Befehlszeile drucken? Zum Beispiel: Ich brauche seq, um einen IP-Bereich von 10.0.0.1 bis 10.0.0.23 zu drucken. Die Periode zwischen den Oktetten scheint zu bewirken, dass sich die Zahl wie ein Gleitkomma verhält. Ich erhalte einen "ungültigen Gleitkomma-Argumentfehler". Ich habe versucht, die Option -f zu verwenden. Vielleicht benutze ich es nicht richtig. Aber es gab mir immer noch einen Fehler. Ich versuche etwas Ähnliches

seq 10.0.0.2 10.0.0.23

Gibt es eine andere Möglichkeit, IP-Adressen in einem Bereich unter Linux zu drucken, als auf Excel umzuschalten?


5
Mit bashkann dieser Adressbereich gedruckt werden echo 10.0.0.{2..23}. Das {..}Konstrukt heißt Klammererweiterung.
John1024

Antworten:


22

Verwenden Sie ein Format:

$ 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

Leider ist dies nicht offensichtlich, da GNU keine Manpages schreibt.


2
Ich denke, es wäre besser, auf das Handbuch zu verweisen, als nur zu bemerken, dass die Manpage zu kurz ist. Siehe info coreutils 'seq invocation'.
Håkan Lindqvist

1
@ HåkanLindqvist Ich hasse, absolut hasse, GNU Info. Und ganz zu schweigen davon, dass %gdas dort auch nicht dokumentiert ist; Sie müssen die richtige printfInfoseite suchen.
Michael Hampton

2
Auf jeden man 3 printfFall ist auch eine Referenzierung eine gute Idee, falls der Leser mit Zeichenfolgen im printf-Format nicht vertraut ist. Trotzdem bin ich auch kein großer Fan der Verwendung von texinfo, aber dies war nur mein Vorschlag, Ihre Antwort zu verbessern, indem Sie die vorhandene Dokumentation verwenden, indem Sie nur auf die fehlende Dokumentation in einem bestimmten Format hinweisen.
Håkan Lindqvist

11

Es gibt das pripsDienstprogramm, das eine IP-Liste aus einem Bereich oder CIDR generiert. Nützlich für Arbeiten mit großen Reichweiten:

$ 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

Sie können den Befehl sed mit seq verwenden, um den IP-Adressbereich zu drucken.

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

ODER mit echo und tr

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

3

Der printfBefehl führt eine implizite Iteration durch, wenn mehr Argumente als Konvertierungsspezifizierer angegeben werden. Zum Beispiel:

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

Es gibt zwei Konvertierungen, aber sechs Argumente. Es treten also drei Wiederholungen der Formatierungslogik auf, die paarweise über die Argumente marschieren.

Damit können wir tun:

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

Der printfBefehl und sein sich wiederholendes Verhalten entsprechen dem POSIX-Standard : "Der Formatoperand muss so oft wie nötig wiederverwendet werden, um die Argumentoperanden zu erfüllen." Auf der anderen Seite ist der seqBefehl nicht.


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

@don_crissti, warum?
user163009

"Warum" was?
don_crissti

die bearbeiten und abstimmen?
user163009

Ich bin nicht der Downvoter - höchstwahrscheinlich hat das System Ihre Antwort automatisch downvotiert. Ich habe es nur überprüft (bearbeitet). Warum bearbeiten? Nun, weil es Code ist und richtig formatiert sein sollte.
don_crissti

2

Wenn wir die Anforderung zur Verwendung des seqBefehls entfernen und davon ausgehen, dass der ipcalcBefehl verfügbar ist und der Ubuntu- pripsBefehl nicht, pripskann er als Bash-Shell-Funktion implementiert werden:

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}"
}

Beachten Sie, dass dies die Netzwerkadresse und die Broadcast-Adresse im Bereich enthält. Wenn dies ein Problem ist, löschen Sie die erste und letzte Adresse aus dem Ergebnis.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.