Je viens d'écrire le script bash suivant pour vérifier l'accès ping sur la liste des machines Linux:
for M in $list
do
ping -q -c 1 "$M" >/dev/null
if [[ $? -eq 0 ]]
then
echo "($C) $MACHINE CONNECTION OK"
else
echo "($C) $MACHINE CONNECTION FAIL"
fi
let C=$C+1
done
Cela imprime:
(1) linux643 CONNECTION OK
(2) linux72 CONNECTION OK
(3) linux862 CONNECTION OK
(4) linux12 CONNECTION OK
(5) linux88 CONNECTION OK
(6) Unix_machinetru64 CONNECTION OK
Comment puis-je utiliser printf
(ou toute autre commande) dans mon script bash afin d'imprimer le format suivant?
(1) linux643 ............ CONNECTION OK
(2) linux72 ............. CONNECTION OK
(3) linux862 ............ CONNECTION OK
(4) linux12 ............. CONNECTION OK
(5) linux88 ............. CONNECTION FAIL
(6) Unix_machinetru64 ... CONNECTION OK
bash
shell-script
printf
Yael
la source
la source
$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.Réponses:
Utiliser l'expansion des paramètres pour remplacer les espaces résultant de
%-s
points:la source
%2d
ajout d'un espace inutile à l'intérieur des parenthèses (bien que cela puisse être utile lorsque $ list> = 10); ii) pour obtenir la sortie exacte de l'OP , vous voudrez peut-être ajoutermachine_indented=${machine_indented/../ .}
pour ajouter un espace supplémentaire avant le premier.
. Comme je l'ai dit, pédant.for m in $list
est lazsh
syntaxe. Cebash
seraitfor i in "${list[@]}"
.bash
n'a pas d'opérateurs de remplissage. Vous pouvez faire du remplissage avecprintf
mais uniquement avec des espaces, pas des caractères arbitraires.zsh
a des opérateurs de remplissage.L' opérateur de remplissage est
${(r:25:)parameter}
à droite- pad avec une longueur de 25 avec des espaces ou${(r:25::string:)parameter}
à droite -pad avec n'importe quelle chaîne au lieu de l'espace.Nous utilisons également
printf '%4s'
à gauche -pad les(x)
espaces. Nous aurions pu utiliser à la${(l:4:):-"($((++c)))"}
place. Une différence notable est cependant que si la chaîne fait plus de 4 caractères, la${(l)}
tronquerait, alors qu'elle déborderaitprintf
.la source
Le
%s
spécificateur de format peut prendre une précision (%.20s
par exemple), et tout comme lorsque vous voulez sortir une valeur flottante avec une certaine précision (avec%.4f
par exemple), la sortie sera au plus autant de caractères de l'argument de chaîne donné.Créez donc une chaîne contenant le nom de la machine et suffisamment de points pour manquer de points:
Production:
la source
Avec des trucs volés à la réponse de @ choroba:
la source
Je le ferais avec
fping
etawk
. Malheureusement,awk
« sprintf
ne peut pas pad avec des points, uniquement avec des espaces ou des zéros si je dois écrire une fonction: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'unEND {}
bloc, et pour les / regexp-matchs / juste insérer le nom d' hôte dans l' un des trois tableaux, par exempleok
,fail
,unknown
. ou juste un tableau associatif (par exemplehosts[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 lefping
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 lesort
, les hôtes inconnus apparaîtront toujours en premier dans la sortie. Tout simplementsort
sans la-k3
volonté de trier par nom d'hôte.la source