Właśnie napisałem następujący skrypt bash, aby sprawdzić dostęp do pingów na liście komputerów z systemem 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
To drukuje:
(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
Jak mogę użyć printf
(lub dowolnego innego polecenia) w skrypcie bash, aby wydrukować następujący format?
(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
źródło
źródło
$TOTAL (length) - $MASHINE (length)
aby uzyskać liczbę kropek. Następnie użyjprintf '.%.s' {1..$DOTS}
w każdej iteracji pętli. Myślę, że coś takiego zadziała.Odpowiedzi:
Używanie interpretacji parametrów do zamiany spacji wynikającej z
%-s
kropek:źródło
%2d
dodaje niepotrzebne miejsce w nawiasach (chociaż może być przydatne, gdy $ list> = 10); ii) aby uzyskać dokładne dane wyjściowe OP , możesz dodać,machine_indented=${machine_indented/../ .}
aby dodać dodatkowe miejsce przed pierwszym.
. Jak powiedziałem, pedantyczny.for m in $list
jestzsh
składnią. Wbash
nim będziefor i in "${list[@]}"
.bash
nie ma operatorów wypełniania. Możesz wypełniaćprintf
tylko spacjami, a nie dowolnymi znakami.zsh
ma operatorów wypełniania.Wyściółka operator jest
${(r:25:)parameter}
do prawej -Pad o długości 25 ze spacjami lub${(r:25::string:)parameter}
do prawej -Pad z dowolnym ciągiem zamiast przestrzeni.Używamy również
printf '%4s'
do lewego- padu(x)
ze spacjami. Moglibyśmy użyć${(l:4:):-"($((++c)))"}
zamiast tego. Istotną różnicą jest jednak to, że jeśli łańcuch ma więcej niż 4 znaki,${(l)}
skróci go, a zostanie przepełnionyprintf
.źródło
Specyfikator
%s
formatu może przyjmować precyzję (%.20s
na przykład) i tak jak w przypadku wyświetlania wartości zmiennoprzecinkowej z określoną precyzją (%.4f
na przykład), wynikiem będzie maksymalnie tyle znaków z podanego argumentu łańcucha.Utwórz ciąg zawierający nazwę komputera i wystarczającą liczbę kropek, aby zabrakło kropek:
Wynik:
źródło
Z rzeczami skradzionymi z odpowiedzi @ choroba:
źródło
Zrobiłbym to za pomocą
fping
iawk
. Niestety,awk
„sprintf
nie może pad z kropek, tylko ze spacji lub zera, więc muszę napisać funkcję:Używam w nawiasach 2-cyfrowej liczby zero-padded, aby format nie został zepsuty, jeśli jest 10-99 hostów
$list
(100+ nadal je zepsuje ). Alternatywą byłoby opóźnić drukowanie aż wEND {}
bloku i na / regexp-meczów / po prostu włóż hosta do jednej z trzech tablic, na przykładok
,fail
,unknown
. lub tylko jedna tablica asocjacyjna (nphosts[hostname]="OK"
.). Następnie możesz policzyć liczbę linii i użyć jej do określenia, jak szerokie powinno być pole licznika linii.Zdecydowałem także, aby w wyniku rozróżniać nieznane hosty (
CONNECTION IMPOSSIBLE
) i nieosiągalne hosty (CONNECTION FAIL
).sort -k3
Jest opcjonalne, to po prostu grupy wyjście przezfping
wynik ( „nazwa hosta jest żywy”, „nazwa hosta jest nieosiągalny” lub „nazwa hosta: Nazwa lub usługa nie znane”). Bez tegosort
nieznane hosty zawsze pojawią się jako pierwsze na wyjściu. Po prostusort
bez-k3
sortowania posortowane według nazwy hosta.źródło