Выводить только «длинные пинги» / Журнал прерываний соединения

Выводить только «длинные пинги» / Журнал прерываний соединения

Я использую соединение, которое иногда прерывается на некоторое время, и я пытаюсь точно определить ping, когда при использовании генерируется такой вывод:

64 bytes from 192.168.0.1: icmp_req=1196 ttl=64 time=4.64 ms
64 bytes from 192.168.0.1: icmp_req=1197 ttl=64 time=5.14 ms
64 bytes from 192.168.0.1: icmp_req=1198 ttl=64 time=4.90 ms
64 bytes from 192.168.0.1: icmp_req=1199 ttl=64 time=25293 ms < -- interruption
64 bytes from 192.168.0.1: icmp_req=1200 ttl=64 time=24286 ms      starts here
64 bytes from 192.168.0.1: icmp_req=1201 ttl=64 time=23278 ms
64 bytes from 192.168.0.1: icmp_req=1202 ttl=64 time=22270 ms
64 bytes from 192.168.0.1: icmp_req=1203 ttl=64 time=21262 ms
64 bytes from 192.168.0.1: icmp_req=1204 ttl=64 time=20254 ms
64 bytes from 192.168.0.1: icmp_req=1224 ttl=64 time=142 ms
64 bytes from 192.168.0.1: icmp_req=1225 ttl=64 time=4.87 ms
64 bytes from 192.168.0.1: icmp_req=1226 ttl=64 time=4.54 ms

Как я могу?

  • Вывести только те строки, которые имеют большую time. Можно ли grepэто сделать?
  • Добавьте к ним временную метку (я знаю о -Dвозможности ping, но я бы предпочел удобочитаемую метку)

решение1

Разработал это решение с помощью grepи awk(вырвано из этого вопроса, возможно, излишне, но это работает)

ping 192.168.0.1 \
| grep -E "time=[0-9]{2}" --line-buffered \
| gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

решение2

Говоря об избыточных решениях, если вы все еще хотите получить ответ на свой первый вопрос (получить только строки со временем больше X), попробуйте следующий уродливый гибридный скрипт bash-python:

#!/bin/bash

IFS='\n' read -r -d '' check_ping <<EOF
from sys import stdin
data = reduce(lambda x, y: str(x) + str(y), stdin.readlines())
time = int(float(data.split("time=")[-1].split(" ")[0].strip()))
if time > $2: print(data)
EOF

ping -c 1 $1 | python -c "${check_ping}"

Если вы поместите это в файл скрипта, скажем test.sh, вы можете передать ему два параметра: имя хоста, который вы хотите пинговать, и минимальный TTL, ниже которого он не должен выводить вывод ping. Например, если вы запустите tst.sh www.google.com 100его, он вернет только ping-запросы на www.google.com, которые занимают более 100 мс.

решение3

Мне не нравится идея обработки текста для такого рода вещей, хотя это и есть unix-y-вещь. Вы можете посмотреть на perl и Net::Ping. С его помощью вы можете определить свой собственный тайм-аут и предпринимать действия только в случае сбоя ping. Подробнее здесь:

http://perldoc.perl.org/Net/Ping.html

Связанный контент