Quiero obtener el resultado fping
siempre 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 fping
comando, donde 151.101.129.164
se coloca primero en el fping
comando pero el resultado se muestra en segundo lugar.
¿Cómo puede 151.101.129.164
mostrarse 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 myfping
y 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.8con 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.1
como equivalente a127.0.0.1
. Entonces, si ustedfping 127.0.1
producefping
una línea de salida que comienza127.0.1
y también tiene un argumento como1.7.0.1
, se tratará como una expresión regular que coincide127.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
arg
of1.7.0.1
se convertirá en undarg
of1\.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 ladarg=
línea adarg=$(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 para127.0.0.1
; entoncesgrep
no encontrarían eso. O tal vez no; revisa tu versión defping
. - 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 interface
case
- Si tiene un argumento que contiene
*
,[
…]
u otros caracteres especiales,grep
puede producir resultados inesperados. No parece probable que esto sea un problema en la vida real. - Si
fping
genera 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.