Як мені позначити час кожного результату пінгу?


80

Ping повертає це за замовчуванням:

64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

Чи є спосіб отримати його для додавання позначки часу?

Наприклад,

Mon 21 May 2012 15:15:37 EST | 64 bytes from 203.173.50.132: icmp_seq=0 ttl=244 time=57.746 ms

Я на OS X v10.7 (Lion), яка, здається, має певну версію ping для BSD .

Відповіді:


10

В OS X ви можете просто використовувати параметр --apple-time:

ping -i 2 --apple-time www.apple.com

Створює такі результати, як:

10:09:55.691216 64 bytes from 72.246.225.209: icmp_seq=0 ttl=60 time=34.388 ms
10:09:57.687282 64 bytes from 72.246.225.209: icmp_seq=1 ttl=60 time=25.319 ms
10:09:59.729998 64 bytes from 72.246.225.209: icmp_seq=2 ttl=60 time=64.097 ms

123

Я не зміг перенаправити рішення, засноване на Perl, у файл з якихось причин, тому продовжував пошук і знайшов bashєдиний спосіб зробити це:

ping www.google.fr | while read pong; do echo "$(date): $pong"; done

Wed Jun 26 13:09:23 CEST 2013: PING www.google.fr (173.194.40.56) 56(84) bytes of data.
Wed Jun 26 13:09:23 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=1 ttl=57 time=7.26 ms
Wed Jun 26 13:09:24 CEST 2013: 64 bytes from zrh04s05-in-f24.1e100.net (173.194.40.56): icmp_req=2 ttl=57 time=8.14 ms

Заслуга належить https://askubuntu.com/a/137246


1
Здається, це не працює на debian wheezy. Просто залишається там без вихідних даних до ctrl + c
KBeezie

1
@KBeezie Не впевнений, у чому була проблема у вашому випадку. Я щойно спробував його на debian wheezy, і він працював нормально. Ви використовуєте bashяк свою оболонку?
richk

7
Мені насправді такий підхід подобається набагато краще, оскільки він не використовує perl або awk.
Олексій Каменський

3
Для того, щоб також бачити таймаут, все , що необхідно для перенаправлення stderrна stdoutперед трубою ( |), наприклад так: ping $host 2>&1 | while read pong; do echo "$(date): $pong"; done. Якщо ви хочете написати (або додати) це до файлу, ви можете перенаправити всю команду (після закінчення). Крім того , якщо ви хочете , щоб не породжувати подоболочкі, то dateкоманда підтримує echoІНГ довільний введення, наприклад , так: ping $host 2>&1 | while read pong; do date "+%c: $pong"; done. Зверніть увагу, що formatаргумент date(який починається з +) можна налаштувати за бажанням. Дивіться man dateдодаткову інформацію.
7heo.tk

FWIW, моєю оболонкою за замовчуванням є ZSH, і вона не працювала. Коли я запускав його в Bash, він працював нормально. OP не згадує про це в першому абзаці свого коментаря ... :)
Леві Фігейра

78

Якщо у вашому AWK немає strftime():

ping host | perl -nle 'print scalar(localtime), " ", $_'

Щоб перенаправити його у файл, використовуйте стандартне перенаправлення оболонки та вимкніть буферизацію виводу:

ping host | perl -nle 'BEGIN {$|++} print scalar(localtime), " ", $_' > outputfile

Якщо вам потрібен формат ISO8601 для позначки часу:

ping host | perl -nle 'use Time::Piece; BEGIN {$|++} print localtime->datetime, " ", $_' > outputfile

хоча я вилучив фільтр 'bytes from', оскільки я хочу мітки часу в кожному рядку ... особливо тайм-аути.
Джон Мі,

Працює добре, але пригнічує STDERR для підсумкових результатів в кінці, коли ви натискаєте Control + C. Те саме питання існує щодо відповіді BASH.
Ніколас Бласген

1
@NicholasBlasgen: Це тому, що Ctrl-C переходить до останнього процесу в трубі і pingотримує лише SIGPIPE. Ви можете використовувати заміну процесу замість труби: ping host > >(perl -nle 'print scalar(localtime), " ", $_')і Ctrl-C перейде до pingі зробить те, що ви хочете. Ви можете зробити те ж саме з whileпетлею. До речі, у моїй системі підсумок йде STDOUTшвидше, ніж STDERR(тому він також отримує позначку часу).
Денніс Вільямсон

Ця відповідь була б набагато кращою, IMHO, якби формат дати та часу був у ISO8601.
Phrogz,

@Phrogz: Я погоджуюсь, що це більш бажаний формат, але моя відповідь наближається до відповідності того, що просив ОП (залежно від локалі). Щоб отримати формат ISO8601, ви можете use Time::Piece; print localtime->datetime(та інші відповідні налаштування), починаючи з 5.10, або використовувати модуль CPAN або strftime.
Денніс Вільямсон

30

Від man ping:

   -D     Print timestamp (unix time + microseconds as in gettimeofday) before each line.

Це дасть приблизно таке:

[1337577886.346622] 64 bytes from 4.2.2.2: icmp_req=1 ttl=243 time=47.1 ms

Тоді мітку часу можна було проаналізувати із pingвідповіді та перетворити у потрібний формат за допомогою date.


2
вибачте. adsl випав, коли я додавав теги ... це OSX Lion - не має опції "-D" :-(
Джон Мі

хтось хороший з perl та регулярним виразом може передати це для форматування в зручний для читання час =]
Cleber Reizen

16
  1. вихід терміналу:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}'

  2. вихід файлу:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt

  3. термінал + вихід файлу:

    ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' | tee test.txt

  4. фон виводу файлу:

    nohup ping -i 5 google.com | xargs -L 1 -I '{}' date '+%Y-%m-%d %H:%M:%S: {}' > test.txt &


8

Моє оригінальне подання було неправильним, оскільки воно не визначало дату для кожного рядка. Виправлення зроблено.

Спробуйте це

 ping google.com | xargs -L 1 -I '{}' date '+%+: {}'

видає наступний результат

Thu Aug 15 10:13:59 PDT 2013: PING google.com (74.125.239.103): 56 data bytes
Thu Aug 15 10:13:59 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=0 ttl=55 time=14.983 ms
Thu Aug 15 10:14:00 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=1 ttl=55 time=17.340 ms
Thu Aug 15 10:14:01 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=2 ttl=55 time=15.898 ms
Thu Aug 15 10:14:02 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=3 ttl=55 time=15.720 ms
Thu Aug 15 10:14:03 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=4 ttl=55 time=16.899 ms
Thu Aug 15 10:14:04 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=5 ttl=55 time=16.242 ms
Thu Aug 15 10:14:05 PDT 2013: 64 bytes from 74.125.239.103: icmp_seq=6 ttl=55 time=16.574 ms

Параметр -L 1 змушує xargs обробляти по одному рядку замість слів.


Не друкується в періоди "Час очікування запиту"; зберігає їх усіх, і вони скидаються з тією ж міткою часу, коли час очікування запиту припиняється.
David Eison

@DavidEison tryping -D -n -O -i1 -W1 8.8.8.8
Thomas Szteliga

6

На macos ви можете це зробити

ping --apple-time 127.0.0.1

Вихід виглядає так

16:07:11.315419 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.064 ms
16:07:12.319933 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.157 ms
16:07:13.322766 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.066 ms
16:07:14.324649 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.148 ms
16:07:15.328743 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.092 ms

5

Спробуйте це:

ping www.google.com | while read endlooop; do echo "$(date): $endlooop"; done

Це повертає щось на зразок:

Wednesday 18 January  09:29:20 AEDT 2017: PING www.google.com (216.58.199.36) 56(84) bytes of data.
Wednesday 18 January  09:29:20 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=1 ttl=57 time=2.86 ms
Wednesday 18 January  09:29:21 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=2 ttl=57 time=2.64 ms
Wednesday 18 January  09:29:22 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=3 ttl=57 time=2.76 ms
Wednesday 18 January  09:29:23 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=4 ttl=57 time=1.87 ms
Wednesday 18 January  09:29:24 AEDT 2017: 64 bytes from syd09s12-in-f36.1e100.net (216.58.199.36): icmp_seq=5 ttl=57 time=2.45 ms

3

Виведіть результат до awk:

 ping host | awk '{if($0 ~ /bytes from/){print strftime()"|"$0}else print}'

має обіцянку! не любить strftime, тому я працюю над цим
Джон Мі

Перевірте цей код у неіснуючого хоста, або коли мережа не працює, я не задоволений цим результатом ;-)
Thomas Szteliga

1

Ви не вказали жодної позначки часу чи інтервалу, скільки часу вам знадобиться такий вихід, тому я вважав це нескінченним циклом. Ви можете змінити його відповідно до ваших потреб.

while true
do
   echo -e "`date`|`ping -n -c 1 <IP_TO_PING>|grep 'bytes from'`"
   sleep 2
done

Вам слід змінити grepчастину на `egrep '(bytes from|errors)'
rubo77

@ rubo77 Чи можете ви пояснити, чому використовувати "egrep" замість "grep"
Венкат Мадхав

egrep лише для того, щоб додати регулярний вираз, щоб отримати вихідні дані і про помилки
rubo77

1
ping -D -n -O -i1 -W1 8.8.8.8

або можливо

while true; do \
    ping -n -w1 -W1 -c1 8.8.8.8 \
    | grep -E "rtt|100%" \
    | sed -e "s/^/`date` /g"; \
    sleep 1; \
done

1

Мені це також потрібно для моніторингу проблем мережі з тим, що стосується часу очікування мого дзеркального відображення бази даних. Я використовую код команди, як показано нижче:

ping -t Google.com|cmd /q /v /c "(pause&pause)>nul & for /l %a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 Google.com>nul" >C:\pingtest.txt

Вам просто потрібно змінити Google.com до імені вашого сервера. Для мене це чудово працює. і не забудьте зупинити це, коли закінчите. Файл pingtest.txt збільшиться на 1 КБ на секунду (приблизно).

Дякуємо за raymond.cc. https://www.raymond.cc/blog/timestamp-ping-with-hrping/


Оновлення: файл pingtest.txt збільшиться на 4,5 КБ на хвилину (приблизно).
DBALUKE HUANG

0

Спробуйте цей рядок.

while sleep 1;do echo "$(date +%d-%m-%y-%T) $(ping -c 1 whatever.com | gawk 'FNR==2{print "Response from:",$4,$8}')" | tee -a /yourfolder/pingtest.log;done

Вам доведеться скасувати це за допомогою ctrl-ctho.


хороша ідея з використанням tee, але проблема з -c 1втратою загальної статистики ...
minusf

0

Ви можете створити функцію у своєму ~/.bashrcфайлі, тому ping-tна консолі ви отримаєте команду ping :

function ping-t { ping "$1" | while read pong; do echo "$(date): $pong"; done; }

Тепер ви можете викликати це на консолі:

ping-t example.com

Суббота 31 квітня 12:58:31 CEST 2018: PING example.com (93.184.216.34) 56 (84) байтів даних.
Сб. 31 квітня 12:58:31 CEST 2018: 64 байта з 93.184.216.34 (93.184.216.34): icmp_seq = 1 ttl = 48 час = 208 мс
Сб 31 березня 12:58:32 CEST 2018: 64 байта з 93.184 .216.34 (93.184.216.34): icmp_seq = 2 ttl = 48 час = 233 мс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.