Cách in một dải địa chỉ IP bằng lệnh seq Linux


8

Làm cách nào tôi có thể in một loạt địa chỉ IP trên dòng lệnh linux bằng lệnh "seq"? Ví dụ: Tôi cần seq để in một phạm vi ip từ 10.0.0.1 đến 10.0.0.23. Có vẻ như khoảng thời gian ở giữa các octet làm cho số đó hoạt động giống như một điểm nổi. Tôi nhận được một "lỗi đối số dấu phẩy động không hợp lệ". Tôi đã thử sử dụng tùy chọn -f. Có thể tôi không sử dụng nó một cách chính xác. Nhưng nó vẫn cho tôi một lỗi. Tôi đang cố gắng để một cái gì đó tương tự như

seq 10.0.0.2 10.0.0.23

Có cách nào khác để in địa chỉ IP trong một phạm vi trong Linux ngoài việc chuyển sang excel không?


5
Với bash, phạm vi địa chỉ có thể được in bằng echo 10.0.0.{2..23}. Cấu {..}trúc được gọi là mở rộng cú đúp.
John1024

Câu trả lời:


22

Sử dụng một định dạng:

$ 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

Thật không may, điều này là không rõ ràng vì GNU không muốn viết các trang man.


2
Tôi nghĩ sẽ tốt hơn nếu tham khảo hướng dẫn mà họ cung cấp hơn là chỉ lưu ý rằng trang người đàn ông cụ thể là quá ngắn gọn. Xem info coreutils 'seq invocation'.
Håkan Lindqvist

1
@ HåkanLindqvist Tôi ghét, hoàn toàn ghét, thông tin GNU. Và không đề cập đến điều đó %gcũng không được ghi nhận ở đó; bạn phải săn lùng printftrang thông tin đúng .
Michael Hampton

2
Tuyệt đối, tham khảo man 3 printflà một ý tưởng tốt trong trường hợp người đọc không quen thuộc với các chuỗi định dạng printf. Điều đó nói rằng, tôi cũng không phải là một fan hâm mộ lớn của việc họ sử dụng texinfo nhưng đây chỉ là đề xuất của tôi để cải thiện câu trả lời của bạn bằng cách sử dụng tài liệu tồn tại qua việc chỉ ra tài liệu thiếu ở định dạng cụ thể.
Håkan Lindqvist

11

pripstiện ích tạo danh sách IP từ một phạm vi hoặc CIDR. Hữu ích cho công việc với phạm vi lớn:

$ 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

Bạn có thể sử dụng lệnh sed với seq để in phạm vi địa chỉ IP.

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

HOẶC sử dụng echo và tr

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

3

Các printflệnh thực hiện lặp đi lặp lại tiềm ẩn nếu nó được đưa ra tranh luận hơn specifiers chuyển đổi. Ví dụ:

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

Có hai chuyển đổi, nhưng sáu đối số. Vì vậy, ba lần lặp lại của logic định dạng xảy ra, diễu hành qua các đối số theo cặp.

Với điều đó chúng ta có thể làm:

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

Các printflệnh, và hành vi lặp đi lặp lại của nó, là tiêu chuẩn POSIX : "Định dạng toán hạng sẽ được tái sử dụng thường xuyên như cần thiết để đáp ứng các toán hạng cuộc tranh cãi." Mặt khác, seqlệnh không.


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

@don_crissti, tại sao?
dùng163009

"Tại sao" là gì?
don_crissti

chỉnh sửa và downvote?
dùng163009

Tôi không phải là người xuống cấp - rất có thể hệ thống sẽ tự động hạ cấp câu trả lời của bạn. Tôi chỉ xem xét nó (chỉnh sửa nó). Tại sao phải chỉnh sửa? Vâng, bởi vì đó là mã và nên được định dạng đúng.
don_crissti

2

Nếu chúng ta loại bỏ yêu cầu sử dụng seqlệnh và giả sử rằng ipcalclệnh đó khả dụng và pripslệnh Ubuntu thì không, sau đó pripscó thể được thực hiện như một hàm 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}"
}

Lưu ý rằng điều này sẽ bao gồm địa chỉ mạng và địa chỉ quảng bá trong phạm vi; nếu đó là một vấn đề, xóa địa chỉ đầu tiên và cuối cùng khỏi kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.