Фильтрация вывода пинга с вырезом - PullRequest
0 голосов
/ 30 мая 2018

У меня проблемы с интернет-провайдером.

Несмотря на то, что был настроен сервер пинг-трафика, который четко показывает, что существуют периодические всплески задержки с потерей пакетов, они запросили трассировку для каждой из целей серверов-коптильных серверов;один набор, когда нет задержки / потери, и другой, когда есть.

Я понимаю, почему они спрашивают, они хотят видеть, есть ли какая-то проблема маршрутизации.

Я создал скрипт, который трассирует все цели сразу и выводит в файл, но мне нужно разработать скрипт, который вызывает скрипт traceroute, когда задержка превышает определенное значение.

ToС этой целью я сделал следующий скрипт, но он не работает, так как вырезать включает в себя не только число, но и «мс».Как я могу дополнительно отфильтровать вывод, чтобы включить только число?

#/bin/bash

while :
    if [ ping | cut -f5 d" " -gl 400 ]
    then
        wait 15
  else
    ./path/script
    fi
done

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вам действительно нужно что-то вроде этого:

ping_res="64 bytes from ya-in-f104.1e100.net (173.194.219.104): icmp_seq=7 ttl=36 time=14.5 ms"
echo $ping_res | awk '{print $7}' | cut -d'=' -f2
36

НО я бы использовал CURL вместо ping и traceroute, который может быть заблокирован и т. Д. (У меня есть пример того, как получить мс ниже)

#!/usr/bin/env bash

    # -- BASH4+ example
    # -- if latency is exceeds max_lat, do something . 

    readonly max_lat="3.1415" # made up number
    readonly url="http://www.google.com/"
    readonly curl_timeout="60"
    readonly delay=120 # seconds

    while [ 1 ] ; do

        val=$(curl -o /dev/null -L -s -w "%{time_total}\n" --max-time ${curl_timeout} "${url}" )

        if [ 1 -eq "$(echo "${val} <= ${max_lat}" | bc)" ] ; then
            echo "${val} <= ${max_lat}, doing something ... "
            ./path/script
        else
            echo "just going to wait $delay seconds and test again .."
            sleep $delay
        fi

    done

Больше примеров awk / cut:

echo $ping_res
64 bytes from ya-in-f104.1e100.net (173.194.219.104): icmp_seq=7 ttl=36 time=14.5 ms
$ echo $ping_res | awk '{print $5}'
(173.194.219.104):
$ echo $ping_res | awk '{print $5}' | cut -d'(' -f2
173.194.219.104):
$ echo $ping_res | awk '{print $5}' | cut -d'(' -f2 | cut -d')' -f1
173.194.219.104

ИЛИ

$ echo $ping_res | awk '{print $8}' | cut -d'=' -f2
 14.5

См .:

Как мне измеритьвремя запроса и ответа одновременно с использованием cURL?

PS> Я могу изменить его (-gl не существует) из вашего примера, но вы поймете.

0 голосов
/ 30 мая 2018

Использование sed для получения только целочисленной части и ограничение числа пингов до 1

#/bin/bash

while :
    ttl=$(ping -n -c1 www.google.com | sed -nre 's/^.* time=([0-9]+)\.[0-9]+ ms$/\1/p')
    if [ "$ttl" -gl 400 ]
    then
        wait 15
else
    ./path/script
    fi
done
...