fping – Como fazer com que o resultado do fping seja sempre sequencial na ordem da linha de comando

fping – Como fazer com que o resultado do fping seja sempre sequencial na ordem da linha de comando

Quero obter o resultado fpingsempre 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 fpingcomando, onde 151.101.129.164é colocado em primeiro lugar no fpingcomando, mas o resultado aparece em segundo lugar.

Como pode a 151.101.129.164exibiçã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 myfpinge 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.8
com 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.1como equivalente a 127.0.0.1. Então, se você fping 127.0.1e fpingproduz uma linha de saída que começa 127.0.1e você também tem um argumento como 1.7.0.1, isso será tratado como uma expressão regular que corresponde a 127.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 argof 1.7.0.1será convertido em a dargof 1\.7\.0\.1, que não corresponderá a 127.0.1.

    O script acima é específico do bash por causa da “string aqui” ( <<< "$arg"). Você pode tornar isso compatível com POSIX alterando a darg=linha para

    darg=$(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 para 127.0.0.1; então eles grepnão encontrariam isso. Ou talvez não; verifique sua versão do fping.
  • 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 interfacecase
  • Se você tiver um argumento que contenha *, []ou alguns outros caracteres especiais, greppoderá produzir resultados inesperados. Isso não parece ser um problema na vida real.
  • Se fpinggerar 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.

informação relacionada