Utilisez printf
pour formater la sortie (c'est aussi plus portable queecho
). Je voudrais également stocker la valeur réelle des séquences d'échappement de couleur au lieu de les stocker sous une forme qui nécessite une expansion par echo
.
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0)
online="${GREEN}online$NC" offline="${RED}offline$NC"
ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"
%-15s
est une spécification de format qui remplit les chaînes avec des espaces à droite afin que la longueur (en nombre de caractères dans zsh
et fish
et octets dans la plupart des autres shells / printf ) soit d'au moins 15.
$ printf '|%-4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcde|
printf '|%4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcde|
Avec troncature:
$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcd|
Les autres utilitaires pour formater le texte dans les colonnes incluent POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(en développant ici le caractère TAB ( \t
) avec des tabulations toutes les 30 colonnes)
Ou BSDcolumn
ou POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(ici, sortie sur 2 colonnes de 36 colonnes de large (voir l' -w
option pour changer la largeur de page par défaut de 72)).
ou BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(comme column
ne commencera pas la sortie tant qu'il n'aura pas lu toutes les entrées).
Ou GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
a également quelques drapeaux d'extension de paramètre pour le remplissage de chaîne: ${(l:15:)hostname}
pour le remplissage de gauche et ${(r:15:)hostname}
pour le remplissage de droite (avec troncature). Dans l'expansion des invites (comme dans les invites ou dans print -P
ou comme activé dans les extensions de paramètres avec l' %
indicateur), il prend également en charge %F{green}
la sortie couleur, vous pouvez donc faire:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Ou:
print -rP "Network ${(r:15:)hostname}: $online"
Bien que le contenu de $hostname
soit alors soumis à une expansion rapide, ce qui constituerait une vulnérabilité d'injection de commande si le contenu de $hostname
n'était pas sous votre contrôle (comme dans hostname='%<a[`reboot`]<'
)
column
(une commande BSD, également portée sur Linux et trouvée par défaut sur certaines distributions, à ne pas confondre avec GNUcolumns
) devra lire l'intégralité de l'entrée avant de pouvoir commencer à produire quelque chose car elle doit calculer la largeur des colonnes en fonction sur le plus large.Mettez à jour votre script pour insérer un nombre défini dans
\t
(onglets) à l'endroit où vous souhaitez accéder à une colonne.La sortie de quelque chose de similaire à ce qui suit vous donnerait l'alignement requis:
la source
printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123
ne s'aligne pas correctement. Vous pouvez contourner cela en utilisantexpand
pour développer les onglets avec un taquet de tabulation différent, comme indiqué dans ma réponse.Pour afficher encore mieux que @Roman
Ajoutez ensuite
\t
chaque ligne pour la diviser en colonne.la source