fping: cómo hacer que el resultado de fping sea siempre secuencial en el orden de la línea de comando

fping: cómo hacer que el resultado de fping sea siempre secuencial en el orden de la línea de comando

Quiero obtener el resultado fpingsiempre secuencial en el orden de los argumentos de la línea de comando.

Por ejemplo, el comando:

fping -e 151.101.129.164 8.8.8.8

podría dar la salida:

8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)

El resultado anterior está en un orden diferente al de los argumentos del fpingcomando, donde 151.101.129.164se coloca primero en el fpingcomando pero el resultado se muestra en segundo lugar.

¿Cómo puede 151.101.129.164mostrarse primero el resultado sin cambiar el orden del primer comando fping?

Respuesta1

Una forma es escribir un script contenedor:

#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
        case "$arg" in
          (-*)  # Ignore options
                ;;
          (*)   grep "^$arg " "$myfile"
        esac
done
rm "$myfile"

Entonces, si llamas a esto myfpingy lo ejecutas myfping -e 151.101.129.164 8.8.8.8 (donde debes anteponer ./ o colocar el script en un directorio que esté en tu RUTA), se ejecutará

    fping -e 151.101.129.164 8.8.8.8
con salida a un archivo temporal, y luego revise los argumentos en el orden de la línea de comandos (de izquierda a derecha) y extraiga los resultados en orden.

Notas:

  • El analizador de direcciones IPv4 es muy flexible; en la mayoría (si no en todos) los sistemas, se interpretará 127.0.1como equivalente a 127.0.0.1. Entonces, si usted fping 127.0.1produce fpinguna línea de salida que comienza 127.0.1y también tiene un argumento como 1.7.0.1, se tratará como una expresión regular que coincide 127.0.1. Puedes superar esto de la siguiente manera:

    #!/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"
    

    donde un argof 1.7.0.1se convertirá en un dargof 1\.7\.0\.1, que no coincidirá 127.0.1.

    El script anterior es específico de bash debido a la "cadena aquí" ( <<< "$arg"). Puede hacer que esto sea compatible con POSIX cambiando la darg=línea a

    darg=$(printf "%s" "$arg" | sed 's/\./\\./g')
    
  • Lo anterior podría ser una pista falsa. Si tu fping 127.0.1, entoncesfping podríanormalizar la dirección y reportar el resultado para 127.0.0.1; entonces grepno encontrarían eso. O tal vez no; revisa tu versión de fping.
  • Si utiliza alguna opción que tenga argumentos, como o , la lógica de mi script tratará los argumentos de la opción como si fueran argumentos ordinarios; es decir, nombres/direcciones de host de destino. Probablemente esto no importe.-c count-I interfacecase
  • Si tiene un argumento que contiene *, []u otros caracteres especiales, greppuede producir resultados inesperados. No parece probable que esto sea un problema en la vida real.
  • Si fpinggenera información que no corresponde a un argumento de dirección/nombre de host de destino, no la verá.
  • Este script no sale con el estado de salida de fping. Arreglar eso se deja como ejercicio.

información relacionada