Saya akan melakukannya dengan fping
dan awk
. Sayangnya, awk
itu printf
tidak bisa pad dengan titik, hanya dengan spasi atau nol jadi saya harus menulis fungsi:
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
Saya menggunakan angka 2 digit nol-empuk di dalam tanda kurung sehingga format tidak kacau jika ada 10-99 host di $list
(100+ masih akan mengacaukannya). Alternatif akan menunda pencetakan sampai seorang END {}
blok, dan untuk / regexp-pertandingan / hanya memasukkan nama host ke dalam satu dari tiga array, misalnya ok
, fail
, unknown
. atau hanya satu array asosiatif (misalnya hosts[hostname]="OK"
). Kemudian Anda bisa menghitung jumlah garis dan menggunakannya untuk memutuskan seberapa lebar bidang penghitung garis seharusnya.
Saya juga memutuskan untuk membuat keluaran membedakan antara host yang tidak dikenal ( CONNECTION IMPOSSIBLE
) dan host yang tidak terjangkau ( CONNECTION FAIL
).
The sort -k3
adalah opsional, itu hanya kelompok output dengan fping
hasil ( "hostname masih hidup", "hostname adalah unreachable" atau "hostname: Nama atau layanan yang tidak dikenal"). Tanpa itu sort
, host yang tidak dikenal akan selalu muncul pertama kali di output. Cukup sort
tanpa -k3
kehendak untuk mengurutkan berdasarkan nama host.
$TOTAL (length) - $MASHINE (length)
untuk mendapatkan jumlah titik. Kemudian gunakanprintf '.%.s' {1..$DOTS}
di setiap iterasi loop. Sesuatu seperti ini saya pikir akan berhasil.