Lo haría con fping
y awk
. Por desgracia, awk
's printf
no se puede rellenar con puntos, sólo que con espacios o ceros así que tengo que escribir una función:
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
Estoy usando números de 2 dígitos rellenados con ceros entre paréntesis para que el formato no se arruine si hay 10-99 hosts $list
(100+ aún lo arruinarán). La alternativa sería retrasar la impresión hasta que un END {}
bloque, y para los / de expresiones regulares-partidos / a sólo tiene que insertar el nombre de host en una de tres arrays, por ejemplo ok
, fail
, unknown
. o solo una matriz asociativa (por ejemplo hosts[hostname]="OK"
). Luego podría contar el número de líneas y usarlo para decidir qué tan ancho debe ser el campo del contador de línea.
También he decidido que la salida distinga entre hosts desconocidos ( CONNECTION IMPOSSIBLE
) y hosts inalcanzables ( CONNECTION FAIL
).
El sort -k3
es opcional, solo agrupa la salida por el fping
resultado ("el nombre de host está vivo", "el nombre de host es inalcanzable" o "nombre de host: nombre o servicio desconocido"). Sin el sort
, los hosts desconocidos siempre aparecerán primero en la salida. Simplemente sort
sin la -k3
voluntad ordenar por nombre de host.
$TOTAL (length) - $MASHINE (length)
para obtener el número de puntos. Luego, useprintf '.%.s' {1..$DOTS}
en cada iteración de bucle. Algo así creo que funcionará.