Quero obter o resultado fping
sempre sequencial na ordem dos argumentos da linha de comando.
Por exemplo, o comando:
fping -e 151.101.129.164 8.8.8.8
pode dar a saída:
8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)
O resultado acima está em uma ordem diferente dos argumentos do fping
comando, onde 151.101.129.164
é colocado em primeiro lugar no fping
comando, mas o resultado aparece em segundo lugar.
Como pode a 151.101.129.164
exibição do primeiro resultado sem alterar a ordem do primeiro comando fping?
Responder1
Uma maneira é escrever um script wrapper:
#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
case "$arg" in
(-*) # Ignore options
;;
(*) grep "^$arg " "$myfile"
esac
done
rm "$myfile"
Então, se você chamar this myfping
e executar myfping -e 151.101.129.164 8.8.8.8
(onde você precisa preceder ./
ou colocar o script em um diretório que está no seu PATH), ele será executado
fping -e 151.101.129.164 8.8.8.8com saída para um arquivo temporário e, em seguida, analise os argumentos na ordem da linha de comando (da esquerda para a direita) e extraia os resultados em ordem.
Notas:
O analisador de endereços IPv4 é muito flexível; na maioria (se não em todos) dos sistemas, será interpretado
127.0.1
como equivalente a127.0.0.1
. Então, se vocêfping 127.0.1
efping
produz uma linha de saída que começa127.0.1
e você também tem um argumento como1.7.0.1
, isso será tratado como uma expressão regular que corresponde a127.0.1
. Você pode superar isso da seguinte maneira:#!/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"
onde an
arg
of1.7.0.1
será convertido em adarg
of1\.7\.0\.1
, que não corresponderá a127.0.1
.O script acima é específico do bash por causa da “string aqui” (
<<< "$arg"
). Você pode tornar isso compatível com POSIX alterando adarg=
linha paradarg=$(printf "%s" "$arg" | sed 's/\./\\./g')
- O que foi dito acima pode ser uma pista falsa. Se você
fping 127.0.1
, entãofping
podernormalize o endereço e informe o resultado para127.0.0.1
; então elesgrep
não encontrariam isso. Ou talvez não; verifique sua versão dofping
. - Se você usar qualquer opção que tenha argumentos, como ou , a lógica do meu script tratará os argumentos das opções como se fossem argumentos comuns; ou seja, nomes/endereços de host de destino. Isso provavelmente não importará.
-c count
-I interface
case
- Se você tiver um argumento que contenha
*
,[
…]
ou alguns outros caracteres especiais,grep
poderá produzir resultados inesperados. Isso não parece ser um problema na vida real. - Se
fping
gerar qualquer informação que não corresponda a um argumento de nome/endereço do host de destino, você não a verá. - Este script não sai com o status de saída de
fping
. A correção disso fica como exercício.