Ich habe gerade das folgende Bash-Skript geschrieben, um den Ping-Zugriff auf die Liste der Linux-Computer zu überprüfen:
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
Dies druckt:
(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
Wie kann ich printf
(oder einen anderen Befehl) in meinem Bash-Skript verwenden, um das folgende Format zu drucken?
(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
quelle
quelle
$TOTAL (length) - $MASHINE (length)
um die Anzahl der Punkte zu ermitteln. Verwenden Sie dannprintf '.%.s' {1..$DOTS}
in jeder Schleifeniteration. So etwas wird meiner Meinung nach funktionieren.Antworten:
Verwenden der Parametererweiterung zum Ersetzen von Leerzeichen
%-s
durch Punkte:quelle
%2d
fügt einen unnötigen Platz in den Klammern hinzu (obwohl es nützlich sein kann, wenn $ list> = 10 ist); ii) Um die genaue Ausgabe des OP zu erhalten , möchten Sie möglicherweise hinzufügenmachine_indented=${machine_indented/../ .}
, um vor dem ersten einen zusätzlichen Speicherplatz hinzuzufügen.
. Wie gesagt pedantisch.for m in $list
istzsh
Syntax. Darinbash
wärefor i in "${list[@]}"
.bash
hat keine Auffülloperatoren. Sie könnenprintf
mit Leerzeichen auffüllen, jedoch nur mit Leerzeichen, nicht mit beliebigen Zeichen.zsh
hat Polsterungsoperatoren.Der padding - Operator ist ,
${(r:25:)parameter}
um rechte -pad mit der Länge 25 mit Räumen oder${(r:25::string:)parameter}
zur rechten -pad mit jeder Zeichenfolge anstelle des Raumes.Wir verwenden auch
printf '%4s'
das linke Pad(x)
mit Leerzeichen. Wir hätten${(l:4:):-"($((++c)))"}
stattdessen verwenden können. Ein bemerkenswerter Unterschied ist jedoch, dass wenn die Zeichenfolge länger als 4 Zeichen ist,${(l)}
sie abgeschnitten wird, während sie mit überläuftprintf
.quelle
Der
%s
Formatbezeichner kann eine Genauigkeit annehmen (%.20s
zum Beispiel), und genau wie wenn Sie einen Gleitkommawert mit einer bestimmten Genauigkeit ausgeben möchten (mit%.4f
zum Beispiel), wird die Ausgabe höchstens so viele Zeichen aus dem angegebenen Zeichenfolgenargument enthalten.Erstellen Sie also eine Zeichenfolge, die den Maschinennamen und genügend Punkte enthält, damit die Punkte ausgehen:
Ausgabe:
quelle
Mit Sachen, die aus @ chorobas Antwort gestohlen wurden:
quelle
Ich würde es mit
fping
und machenawk
. Leiderawk
istprintf
kann nicht Pad mit Punkten, nur mit Leerzeichen oder Nullen so habe ich eine Funktion schreiben:Ich verwende nullgefüllte zweistellige Zahlen in Klammern, damit das Format nicht durcheinander gerät, wenn 10-99 Hosts vorhanden sind
$list
(100+ vermasseln es immer noch). Die Alternative wäre, zu verzögern , bis ein Druck -END {}
Block und für das / regexp-matches / Insert nur den Host - Namen in einem von drei Gruppen, zum Beispielok
,fail
,unknown
. oder nur ein assoziatives Array (zBhosts[hostname]="OK"
). Dann können Sie die Anzahl der Zeilen zählen und damit entscheiden, wie breit das Zeilenzählerfeld sein soll.Ich habe auch beschlossen, die Ausgabe zwischen unbekannten Hosts (
CONNECTION IMPOSSIBLE
) und nicht erreichbaren Hosts (CONNECTION FAIL
) unterscheiden zu lassen.Das
sort -k3
ist optional, es gruppiert nur die Ausgabe nach demfping
Ergebnis ("Hostname lebt", "Hostname ist nicht erreichbar" oder "Hostname: Name oder Dienst nicht bekannt"). Ohne dassort
werden die unbekannten Hosts immer zuerst in der Ausgabe angezeigt. Einfachsort
ohne den-k3
Willen nach Hostnamen sortieren.quelle