Вывод только "длинных пингов" / Журнал прерываний соединения
Я нахожусь на соединении, которое иногда прерывается на некоторое время, и я пытаюсь точно определить при использовании 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
, но я бы предпочел читабельный штамп)
3 ответа
Разработал это решение с 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(); }'
Говоря о решениях с избыточным количеством ресурсов, если вы все еще хотите получить ответ на свой первый вопрос (получите строки только со временем, превышающим 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
он будет только возвращать пинги на www.google.com, которые занимают более 100 мс.
Мне не нравится идея обрабатывать текст для такого рода вещей, хотя это единственная вещь, которую нужно делать. Вы можете посмотреть на perl & Net::Ping. С его помощью вы можете определить свой собственный тайм-аут и принимать меры только при сбое пинга. Больше здесь: