Tôi sẽ làm điều đó với fping
và awk
. Thật không may, awk
là printf
không thể pad với dấu chấm, chỉ có khoảng trắng hoặc zero vì vậy tôi phải viết một hàm:
list=(kali surya indra ganesh durga hanuman nonexistent)
fping "${list[@]}" 2>&1 |
sort -k3 |
awk -F'[: ]' 'BEGIN { fmt="(%02d) %s CONNECTION %s\n"};
function dotpad(s,maxlen, l,c,pads) {
l = maxlen - length(s);
pads = "";
for (c=0;c<l;c++) {pads=pads"."};
return s " " pads
};
/alive$/ { printf fmt, ++i, dotpad($1,19), "OK" };
/unreachable$/ { printf fmt, ++i, dotpad($1,19), "FAIL" }
/not known$/ { printf fmt, ++i, dotpad($1,19), "IMPOSSIBLE" } '
(01) durga .............. CONNECTION OK
(02) ganesh ............. CONNECTION OK
(03) indra .............. CONNECTION OK
(04) kali ............... CONNECTION OK
(05) nonexistent ........ CONNECTION IMPOSSIBLE
(06) hanuman ............ CONNECTION FAIL
(07) surya .............. CONNECTION FAIL
Tôi đang sử dụng các số có 2 chữ số được đệm bằng 0 trong ngoặc đơn để định dạng không bị sai lệch nếu có 10-99 máy chủ lưu trữ $list
(100+ vẫn sẽ làm hỏng nó). Việc thay thế sẽ được trì hoãn cho đến khi in một END {}
khối, và cho / regexp-diêm / chỉ chèn tên máy vào một trong ba mảng, ví dụ như ok
, fail
, unknown
. hoặc chỉ một mảng kết hợp (ví dụ hosts[hostname]="OK"
). Sau đó, bạn có thể đếm số lượng dòng và sử dụng số đó để quyết định độ rộng của trường bộ đếm dòng.
Tôi cũng đã quyết định phân biệt đầu ra giữa các máy chủ không xác định ( CONNECTION IMPOSSIBLE
) và máy chủ không thể truy cập ( CONNECTION FAIL
).
Đây sort -k3
là tùy chọn, nó chỉ nhóm đầu ra theo fping
kết quả ("tên máy chủ còn sống", "tên máy chủ không thể truy cập được" hoặc "tên máy chủ: Tên hoặc dịch vụ không được biết"). Không có sort
, các máy chủ không xác định sẽ luôn xuất hiện đầu tiên trong đầu ra. Chỉ đơn giản là sort
không có ý -k3
chí sắp xếp theo tên máy chủ.
$TOTAL (length) - $MASHINE (length)
để có được số lượng dấu chấm. Sau đó sử dụngprintf '.%.s' {1..$DOTS}
trong mỗi vòng lặp lặp. Một cái gì đó như thế này tôi nghĩ sẽ làm việc.