Linux seqコマンドでIPアドレスの範囲を印刷する方法


8

「seq」コマンドを使用してLinuxコマンドラインでIPアドレスの範囲を印刷するにはどうすればよいですか?たとえば:10.0.0.1から10.0.0.23の範囲のIPを出力するためにseqが必要です。オクテット間のピリオドのように見えて、数値は浮動小数点のように動作します。「無効な浮動小数点引数エラー」が発生します。-fオプションを使ってみました。正しく使用していない可能性があります。しかし、それでもエラーが発生しました。私はに似たものにしようとしています

seq 10.0.0.2 10.0.0.23

LinuxでExcelに切り替える以外にIPアドレスを印刷する別の方法はありますか?


5
を使用するとbash、その範囲のアドレスをで印刷できますecho 10.0.0.{2..23}。この{..}構造はブレース拡張と呼ばれます。
John1024 2014年

回答:


22

次の形式を使用します。

$ 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

残念ながら、GNUはmanページを書くことを好まないため、これは自明ではありません。


2
マニュアルページが非常に簡潔であることを指摘するだけでなく、それらが提供するマニュアルを参照する方が良いと思います。を参照してくださいinfo coreutils 'seq invocation'
ホーカンLindqvist

1
@HåkanLindqvist嫌い、絶対嫌い、GNU info。そして、それ%gはそこにも文書化されていません。あなたは正しいprintf情報ページを探し出す必要があります。
マイケルハンプトン

2
man 3 printfもちろん、読者がprintf形式の文字列に慣れていない場合は、参照することもお勧めします。とは言っても、私は彼らのtexinfoの使用の大ファンではありませんが、これは、特定の形式で不足しているドキュメントを指摘するだけで存在するドキュメントを利用することにより、回答を改善するための私の提案にすぎません。
ホーカンLindqvist

11

範囲またはCIDRからIPリストを生成するpripsユーティリティがあります。広い範囲での作業に役立ちます:

$ 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

sedコマンドをseqとともに使用して、IPアドレスの範囲を出力できます。

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

またはechoとtrを使用

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

3

printfコマンドは、変換指定子よりも多くの引数を指定した場合、暗黙的な反復を実行します。例えば:

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

2つの変換がありますが、6つの引数があります。したがって、書式設定ロジックが3回繰り返され、引数をペアで行進します。

これで、次のことができます。

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

printfコマンド、そしてその繰り返し動作が、あるPOSIX標準「形式オペランド引数オペランドを満足するよう、多くの場合、必要に応じて再利用されなければなりません。」 一方、seqコマンドはそうではありません。


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

@don_crissti、なぜ?
user163009 2016年

「なぜ」何をしますか?
don_crissti 2016年

編集と反対投票?
user163009

私は反対投票者ではありません。おそらくシステムが自動的に回答に反対投票しました。私はそれだけをレビューしました(編集しました)。なぜ編集するのですか?まあ、それはコードであり、適切にフォーマットされるべきだからです。
don_crissti

2

seqコマンドを使用するための要件を削除し、ipcalcコマンドが使用可能であり、Ubuntu pripsコマンドが使用できないと想定した場合、pripsBashシェル関数として実装できます。

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

これには、範囲内のネットワークアドレスとブロードキャストアドレスが含まれることに注意してください。問題がある場合は、結果から最初と最後のアドレスを削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.