Ich möchte das Ergebnis fping
immer in der Reihenfolge der Befehlszeilenargumente erhalten.
Beispielsweise der Befehl:
fping -e 151.101.129.164 8.8.8.8
könnte folgende Ausgabe liefern:
8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)
Das obige Ergebnis weist eine andere Reihenfolge auf als die Argumente des fping
Befehls. Es 151.101.129.164
wird im Befehl an erster Stelle genannt , fping
das Ergebnis wird jedoch an zweiter Stelle angezeigt.
Wie kann das 151.101.129.164
Ergebnis zuerst angezeigt werden, ohne die Reihenfolge des ersten FPing-Befehls zu ändern?
Antwort1
Eine Möglichkeit besteht darin, ein Wrapper-Skript zu schreiben:
#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
case "$arg" in
(-*) # Ignore options
;;
(*) grep "^$arg " "$myfile"
esac
done
rm "$myfile"
Wenn Sie dies also aufrufen myfping
und ausführen myfping -e 151.101.129.164 8.8.8.8
(wobei Sie das Skript entweder voranstellen ./
oder in ein Verzeichnis in Ihrem PATH legen müssen), wird es ausgeführt
fping -e 151.101.129.164 8.8.8.8mit Ausgabe in eine temporäre Datei. Gehen Sie dann die Argumente in der Befehlszeilenreihenfolge (von links nach rechts) durch und ziehen Sie die Ergebnisse der Reihe nach heraus.
Anmerkungen:
Der IPv4-Adressparser ist sehr flexibel; auf den meisten (wenn nicht allen) Systemen wird er
127.0.1
als äquivalent zu interpretiert127.0.0.1
. Wenn Sie alsofping 127.0.1
undfping
eine Ausgabezeile erzeugen, die mit beginnt127.0.1
, und Sie außerdem ein Argument wie haben1.7.0.1
, wird das als regulärer Ausdruck behandelt, der mit übereinstimmt127.0.1
. Sie können dies folgendermaßen umgehen:#!/bin/bash myfile=$(mktemp) ./fping "$@" > "$myfile" for arg do case "$arg" in (-*) # Ignore options ;; (*) darg=$(sed 's/\./\\./g' <<< "$arg") grep "^$darg " "$myfile" esac done rm "$myfile"
wobei ein
arg
„von“ in ein „von“1.7.0.1
umgewandelt wird , was nicht mit übereinstimmt .darg
1\.7\.0\.1
127.0.1
Das obige Skript ist aufgrund des „Here Strings“ (
<<< "$arg"
) bash-spezifisch. Sie können es POSIX-kompatibel machen, indem Sie diedarg=
Zeile ändern indarg=$(printf "%s" "$arg" | sed 's/\./\\./g')
- Das Obige könnte eine falsche Fährte sein. Wenn Sie
fping 127.0.1
, dannfping
könnteNormalisieren Sie die Adresse und melden Sie das Ergebnis für127.0.0.1
; danngrep
würde das nicht gefunden. Oder vielleicht auch nicht; überprüfen Sie Ihre Version vonfping
. - Wenn Sie Optionen mit Argumenten wie oder verwenden , behandelt die Logik in meinem Skript die Optionsargumente wie normale Argumente, d. h. Zielhostnamen/-adressen. Dies spielt wahrscheinlich keine Rolle.
-c count
-I interface
case
- Wenn Sie ein Argument haben, das
*
,[
…]
oder andere Sonderzeichen enthält,grep
kann dies zu unerwarteten Ergebnissen führen. Im wirklichen Leben dürfte dies jedoch kein Problem darstellen. - Wenn
fping
Informationen ausgegeben werden, die nicht mit dem Argument eines Zielhostnamens/-adressse übereinstimmen, werden sie nicht angezeigt. - Dieses Skript wird nicht mit dem Beendigungsstatus von beendet
fping
. Das Beheben dieses Problems bleibt eine Übung.