Cara mencetak berbagai alamat IP dengan perintah Linux seq

8

Bagaimana saya bisa mencetak berbagai alamat ip pada baris perintah linux menggunakan perintah "seq"? Sebagai contoh: Saya perlu seq untuk mencetak kisaran ip dari 10.0.0.1 hingga 10.0.0.23. Sepertinya periode di antara oktet menyebabkan angka berperilaku seperti titik mengambang. Saya mendapatkan "kesalahan argumen floating point yang tidak valid". Saya mencoba menggunakan opsi -f. Mungkin saya tidak menggunakannya dengan benar. Tapi itu masih memberi saya kesalahan. Saya mencoba sesuatu yang mirip

seq 10.0.0.2 10.0.0.23

Apakah ada cara lain untuk mencetak alamat IP dalam rentang di Linux selain beralih ke unggul?

pengguna2476714
sumber
5
Dengan bash, kisaran alamat itu dapat dicetak echo 10.0.0.{2..23}. The {..}membangun disebut ekspansi brace.
John1024

Jawaban:

22

Gunakan 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

Sayangnya ini tidak jelas karena GNU tidak suka menulis halaman manual.

Michael Hampton
sumber
2
Saya pikir akan lebih baik untuk referensi manual yang mereka berikan daripada hanya mencatat bahwa halaman manual secara khusus terlalu singkat. Lihat info coreutils 'seq invocation'.
Håkan Lindqvist
1
@ HåkanLindqvist Saya benci, benar-benar benci, info GNU. Belum lagi yang %gtidak didokumentasikan di sana; Anda harus memburu printfhalaman info yang tepat .
Michael Hampton
2
Tentu saja, referensi man 3 printfjuga merupakan ide bagus jika pembaca tidak terbiasa dengan string format printf. Yang mengatakan, saya bukan penggemar berat penggunaan texinfo baik tetapi ini hanya saran saya untuk meningkatkan jawaban Anda dengan memanfaatkan dokumentasi yang ada hanya menunjukkan kekurangan dokumentasi dalam format tertentu.
Håkan Lindqvist
11

Ada pripsutilitas yang menghasilkan daftar IP dari kisaran atau CIDR. Berguna untuk bekerja dengan rentang besar:

$ 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
pengguna4151603
sumber
8

Anda dapat menggunakan perintah sed dengan seq untuk mencetak berbagai alamat IP.

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

ATAU menggunakan gema dan tr

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

The printfperintah melakukan iterasi implisit jika diberikan lebih argumen dari penentu konversi. Sebagai contoh:

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

Ada dua konversi, tetapi enam argumen. Jadi tiga pengulangan logika pemformatan terjadi, berbaris di atas argumen berpasangan.

Dengan itu bisa kita lakukan:

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

The printfperintah, dan perilakunya berulang, adalah POSIX standar : "Format operan akan digunakan kembali sesering yang diperlukan untuk memenuhi operan argumen." Di sisi lain, seqperintahnya bukan.

Kaz
sumber
3
for i in $(seq 2 23); do echo "10.0.0.$i"; done
pengguna163009
sumber
@don_crissti, mengapa?
user163009
"Kenapa" apa?
don_crissti
edit dan downvote?
user163009
Saya bukan downvoter - kemungkinan besar sistem secara otomatis menurunkan jawaban Anda. Saya hanya memeriksanya (mengeditnya). Mengapa mengedit? Yah, karena itu kode dan harus diformat dengan benar.
don_crissti
2

Jika kami menghapus persyaratan untuk menggunakan seqperintah, dan menganggap bahwa ipcalcperintah itu tersedia, dan pripsperintah Ubuntu tidak, maka pripsdapat diimplementasikan sebagai fungsi Bash shell:

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

Perhatikan bahwa ini akan mencakup alamat jaringan dan alamat siaran dalam jangkauan; jika itu merupakan masalah, hapus alamat pertama dan terakhir dari hasilnya.

Alex Harvey
sumber