Comment imprimer une plage d'adresses IP avec la commande Linux seq

8

Comment puis-je imprimer une plage d'adresses IP sur la ligne de commande Linux en utilisant la commande "seq"? Par exemple: j'ai besoin de seq pour imprimer une plage d'ip de 10.0.0.1 à 10.0.0.23. On dirait que la période entre les octets fait que le nombre se comporte comme une virgule flottante. J'obtiens une "erreur d'argument à virgule flottante non valide". J'ai essayé d'utiliser l'option -f. Peut-être que je ne l'utilise pas correctement. Mais cela m'a quand même donné une erreur. J'essaye quelque chose de similaire à

seq 10.0.0.2 10.0.0.23

Existe-t-il une autre façon d'imprimer des adresses IP dans une plage sous Linux autre que de passer à Excel?

user2476714
la source
5
Avec bash, cette plage d'adresses peut être imprimée avec echo 10.0.0.{2..23}. La {..}construction est appelée expansion d'accolade.
John1024

Réponses:

22

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

Malheureusement, cela n'est pas évident car GNU n'aime pas écrire de pages de manuel.

Michael Hampton
la source
2
Je pense qu'il serait préférable de faire référence au manuel qu'ils fournissent plutôt que de noter que la page de manuel en particulier est trop brève. Tu vois info coreutils 'seq invocation'.
Håkan Lindqvist
1
@ HåkanLindqvist Je déteste, absolument déteste, GNU info. Et sans compter que cela %gn'est pas documenté non plus; vous devez rechercher la bonne printfpage d'informations.
Michael Hampton
2
Absolument, le référencement man 3 printfest également une bonne idée au cas où le lecteur ne serait pas familier avec les chaînes de format printf. Cela dit, je ne suis pas non plus un grand fan de leur utilisation de texinfo, mais c'était juste ma suggestion pour améliorer votre réponse en utilisant la documentation qui existe plutôt que de signaler la documentation manquante dans un format spécifique.
Håkan Lindqvist
11

Il y a l' pripsutilitaire qui génère une liste IP à partir d'une plage ou d'un CIDR. Utile pour travailler avec de grandes plages:

$ 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
la source
8

Vous pouvez utiliser la commande sed avec seq pour imprimer la plage d'adresses IP.

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

OU en utilisant echo et tr

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

La printfcommande effectue une itération implicite si elle reçoit plus d'arguments que de spécificateurs de conversion. Par exemple:

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

Il y a deux conversions, mais six arguments. Ainsi, trois répétitions de la logique de formatage se produisent, en marchant sur les arguments par paire.

Avec cela, nous pouvons faire:

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

La printfcommande, et son comportement répétitif, sont au standard POSIX : "L'opérande de format doit être réutilisé aussi souvent que nécessaire pour satisfaire les opérandes d'argument." D'un autre côté, la seqcommande ne l'est pas.

Kaz
la source
3
for i in $(seq 2 23); do echo "10.0.0.$i"; done
user163009
la source
@don_crissti, pourquoi?
user163009
"Pourquoi" quoi?
don_crissti
la modification et le downvote?
user163009
Je ne suis pas le downvoter - très probablement le système a automatiquement downvoté votre réponse. Je l'ai seulement révisé (édité). Quant à savoir pourquoi modifier? Eh bien, parce que c'est du code et qu'il doit être correctement formaté.
don_crissti
2

Si nous supprimons l'exigence d'utiliser la seqcommande et supposons que la ipcalccommande est disponible et que la pripscommande Ubuntu ne l'est pas, alors nous pripspouvons l'implémenter en tant que fonction 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}"
}

Notez que cela inclura l'adresse réseau et l'adresse de diffusion dans la plage; si c'est un problème, supprimez la première et la dernière adresse du résultat.

Alex Harvey
la source