Je le ferais avec fping
et awk
. Malheureusement, awk
« s printf
ne peut pas pad avec des points, uniquement avec des espaces ou des zéros si je dois écrire une fonction:
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
J'utilise des nombres à deux chiffres remplis de zéros entre parenthèses afin que le format ne soit pas vissé s'il y a 10 à 99 hôtes $list
(100+ le verront toujours). L'alternative serait de retarder l' impression jusqu'à ce qu'un END {}
bloc, et pour les / regexp-matchs / juste insérer le nom d' hôte dans l' un des trois tableaux, par exemple ok
, fail
, unknown
. ou juste un tableau associatif (par exemple hosts[hostname]="OK"
). Ensuite, vous pouvez compter le nombre de lignes et l'utiliser pour décider de la largeur du champ du compteur de lignes.
J'ai également décidé de faire la distinction entre les hôtes inconnus ( CONNECTION IMPOSSIBLE
) et les hôtes inaccessibles ( CONNECTION FAIL
).
Le sort -k3
est facultatif, il regroupe simplement la sortie par le fping
résultat ("le nom d'hôte est vivant", "le nom d'hôte est inaccessible" ou "nom d'hôte: nom ou service inconnu"). Sans le sort
, les hôtes inconnus apparaîtront toujours en premier dans la sortie. Tout simplement sort
sans la -k3
volonté de trier par nom d'hôte.
$TOTAL (length) - $MASHINE (length)
pour obtenir le nombre de points. Ensuite, utilisezprintf '.%.s' {1..$DOTS}
dans chaque itération de boucle. Je pense que quelque chose comme ça fonctionnera.