fping – So stellen Sie sicher, dass die Fping-Ergebnisse immer in der Reihenfolge der Befehlszeile sequenziell sind

fping – So stellen Sie sicher, dass die Fping-Ergebnisse immer in der Reihenfolge der Befehlszeile sequenziell sind

Ich möchte das Ergebnis fpingimmer 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 fpingBefehls. Es 151.101.129.164wird im Befehl an erster Stelle genannt , fpingdas Ergebnis wird jedoch an zweiter Stelle angezeigt.

Wie kann das 151.101.129.164Ergebnis 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 myfpingund 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.8
mit 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.1als äquivalent zu interpretiert 127.0.0.1. Wenn Sie also fping 127.0.1und fpingeine Ausgabezeile erzeugen, die mit beginnt 127.0.1, und Sie außerdem ein Argument wie haben 1.7.0.1, wird das als regulärer Ausdruck behandelt, der mit übereinstimmt 127.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.1umgewandelt wird , was nicht mit übereinstimmt .darg1\.7\.0\.1127.0.1

    Das obige Skript ist aufgrund des „Here Strings“ ( <<< "$arg") bash-spezifisch. Sie können es POSIX-kompatibel machen, indem Sie die darg=Zeile ändern in

    darg=$(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ür 127.0.0.1; dann grepwürde das nicht gefunden. Oder vielleicht auch nicht; überprüfen Sie Ihre Version von fping.
  • 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 interfacecase
  • Wenn Sie ein Argument haben, das *, []oder andere Sonderzeichen enthält, grepkann dies zu unerwarteten Ergebnissen führen. Im wirklichen Leben dürfte dies jedoch kein Problem darstellen.
  • Wenn fpingInformationen 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.

verwandte Informationen