Как фильтровать результаты ping по времени?

Как отфильтровать любые пины, которые находятся под определенным мс, т. Е. Только ответы эхо-пинга выше 500 мс в текстовый файл?

IP=$1 SECONDS_Between_Pings=$2 ping -i $2 $1 | while read pong; do echo $(date) $pong; done >> ~/Downloads/pings_file_$(date +%Y-%m-%d).txt 

grep с расширенным регулярным выражением:

 ping ... | grep --line-buffered -E 'time=([0-9]{4}|[5-9][0-9]{2})' | ... 

Это будет соответствовать любой строке со time= сразу после:

  • Любые 4 цифры (1000+ мс).
  • Одна цифра 5-9, за которой следуют любые 2 цифры (500-999 мс).

--line-buffered работает вокруг проблем, вызванных --line-buffered вывода по умолчанию grep когда используется в цепочке труб. Не требуется, когда grep является последним звеном в цепочке.

Решение Perl:

 ping -i "$2" "$1" | while read pong; do echo $(date) "$pong" ; done \ | perl -ne 'print if (/time=([0-9.]+)/)[0] > .5' >> ~/Downloads/... 

Объяснение: – ([0-9.]+) Соответствует десятичному числу после time= и запоминает его – (…) [0] возвращает первый элемент данного списка (необходимый для переключения из списка в скалярный)