Extraction de données commande ping

Bonjour,

Je chercher a extraire le RTT et le %PACKET LOSS via la commande ping.
Pour le moment j’y arrive, mais je dois lancer deux commandes PING (pas du tout propre !!!):
1 => récupération RTT
2 => récupération % PKLoss

google_rtt=`ping -c 1 -W 1 www.google.fr | grep rtt | tr '/' ' ' | awk '{print $7}'`
echo $google_rtt
google_pkloss=`ping -c 1 -W 1 www.google.fr | grep received | awk '{print $6}' | sed 's/%//g'`
echo $google_pkloss

Est-il possible de récupérer les valeurs de RTT & PK Loss en ne faisant qu’un seul Ping ?

ping=`ping -c 1 -W 1 www.google.fr`
RTT=$(echo $ping | grep rtt .....)
PKLOSS=$(echo $ping | grep .....)

Merci.

Bonjour,

Pas possible de faire une pierre deux coups ?

J’ai trouvé sur Google une fonction, qui ne marche pas, et que je n’arrive pas a l’adapter :

command="ping -q -n -c 3"
ip="173.194.78.94"

get_data() {
    local output=$($command $ip 2>&1)
    local method=$(echo "$output" | $gawk '
        BEGIN {pl=100; rtt=0.1}
        /packets transmitted/ {
            match($0, /([0-9]+)% packet loss/, datapl)
            pl=datapl[1]
        }
        /min\/avg\/max/ {
            match($4, /(.*)\/(.*)\/(.*)\/(.*)/, datartt)
            rtt=datartt[2]
        }
        END {print pl ":" rtt}
        ')
    RETURN_DATA=$method
}

Ton code d’origine fonctionne très bien… à condition que tu prennes la peine de mettre $ping entre guillemets dans le echo :

ping=`ping -c 1 -W 1 www.google.fr` RTT=$(echo "$ping" | grep rtt | tr '/' ' ' | awk '{print $7}') PKLOSS=$(echo "$ping" | grep received | awk '{print $6}' | sed 's/%//g') echo "$RTT" echo "$PKLOSS"

Au risque de me répéter:wink:

Il faut bien comprendre que quand tu utilises une variable sans mettre de guillemets autour, tous les retours chariot deviennent des espaces, et tous les espaces successifs deviennent un seul espace.

Variable d’origine :

1 2 3 4

Résultat avec echo $VARIABLE :

Tu comprends bien que dans ces conditions, tes filtrages ne marchent plus puisque tout est sur une seule ligne.

Autre problème sans les guillemets, les valeurs séparées par des espaces / retours chariots dans ta variable deviennent autant d’arguments différents pour le programme que tu appelles.

[code]$ cat > compte-args <<EOF
#!/bin/sh
echo "$#"
EOF

$ chmod +x compte-args

$ VARIABLE=“1 2 3 4
5 6 7 8”

$ ./compte-args "$VARIABLE"
1

$ ./compte-args $VARIABLE
8[/code]

Bref, utilise TOUJOURS des guillemets autour de tes variables sauf quand tu veux explicitement le comportement sans guillemets que je viens de décrire. Ça t’évitera de nombreux bugs.

Et toujours utiliser $() à la place de `` :

data=( $(ping -c 1 -W 1 www.google.fr | awk '/rtt/{gsub(/\/.*/,"",$4);print $4} /received/{gsub(/%/,"");print $6}') )
echo "${data[1]}"
echo "${data[2]}"

Bonjour :023

@syam
Oui tu as raison… Une erreur de ma part :079
Je le fait, mais pas à chaque fois !!!

@MisterFreez

Ouiii :038

Merci pour les remarques !

Coche verte ?

J’active la coche verte :041

Impec :023