Acabei de escrever o seguinte script bash para verificar o acesso ao ping na lista de máquinas 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
Isso 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
Como posso usar printf
(ou qualquer outro comando) no meu script bash para imprimir o seguinte formato?
(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
fonte
fonte
$TOTAL (length) - $MASHINE (length)
para obter o número de pontos. Em seguida, useprintf '.%.s' {1..$DOTS}
em cada iteração de loop. Algo assim acho que vai funcionar.Respostas:
Usando expansão de parâmetro para substituir espaços resultantes de
%-s
pontos:fonte
%2d
está adicionando um espaço desnecessário entre parênteses (embora possa ser útil quando $ list> = 10); ii) para obter a saída exata do OP ,machine_indented=${machine_indented/../ .}
adicione um espaço extra antes da primeira.
. Como eu disse, pedante.for m in $list
ézsh
sintaxe. Dentrobash
seriafor i in "${list[@]}"
.bash
não possui operadores de preenchimento. Você pode preencher comprintf
apenas espaços, mas não com caracteres arbitrários.zsh
possui operadores de preenchimento.O operador de preenchimento deve
${(r:25:)parameter}
colocar o teclado à direita com comprimento 25, com espaços, ou pressionar o teclado${(r:25::string:)parameter}
à direita com qualquer string em vez de espaço.Nós também usamos
printf '%4s'
a esquerda -pad o(x)
com espaços. Poderíamos ter usado${(l:4:):-"($((++c)))"}
. Uma diferença notável, porém, é que, se a string tiver mais de 4 caracteres, ela${(l)}
será truncada, enquanto ela transbordaráprintf
.fonte
O
%s
especificador de formato pode ter uma precisão (%.20s
por exemplo) e, assim como quando você deseja gerar um valor flutuante para uma certa precisão (com,%.4f
por exemplo), a saída terá no máximo muitos caracteres do argumento de string especificado.Portanto, crie uma string que contenha o nome da máquina e pontos suficientes para ficar sem pontos:
Resultado:
fonte
Com coisas roubadas da resposta da @ choroba:
fonte
Eu faria isso com
fping
eawk
. Infelizmente,awk
não éprintf
possível preencher com pontos, apenas com espaços ou zeros, então eu tenho que escrever uma função:Estou usando números de 2 dígitos preenchidos com zero entre parênteses, para que o formato não seja estragado se houver 10-99 hosts
$list
(mais de 100 ainda estragam tudo). A alternativa seria a atrasar a impressão até que umEND {}
bloco de, e para as partidas / EXPREG-/ a inserção apenas o nome da máquina em uma das três matrizes, por exemplook
,fail
,unknown
. ou apenas uma matriz associativa (por exemplohosts[hostname]="OK"
). Depois, você pode contar o número de linhas e usá-lo para decidir a largura do campo do contador de linhas.Também decidi fazer a saída distinguir entre hosts desconhecidos (
CONNECTION IMPOSSIBLE
) e hosts inacessíveis (CONNECTION FAIL
).A
sort -k3
é opcional, apenas grupos a saída pelofping
resultado ( "hostname está vivo", "hostname é inacessível" ou "hostname: Nome ou serviço desconhecido"). Sem osort
, os hosts desconhecidos sempre aparecerão primeiro na saída. Simplesmentesort
sem a-k3
vontade ordenar por nome de host.fonte