Làm cách nào để đánh dấu thời gian cho mọi kết quả ping?


80

Ping trả về giá trị này theo mặc định:

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

Có cách nào tôi có thể lấy nó để thêm dấu thời gian không?

Ví dụ,

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

Tôi đang sử dụng OS X v10.7 (Lion) có vẻ như có một số phiên bản ping BSD .

Câu trả lời:


10

Trên OS X, bạn chỉ cần sử dụng tùy chọn --apple-time:

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

Tạo ra các kết quả như:

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

Tôi không thể chuyển hướng giải pháp dựa trên Perl đến một tệp vì lý do nào đó, vì vậy tôi tiếp tục tìm kiếm và tìm ra cách bashduy nhất để thực hiện việc này:

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

Tín dụng được chuyển đến https://askubuntu.com/a/137246


1
Điều này dường như không hoạt động trên debian wheezy. Chỉ cần vẫn có mà không cần đầu ra cho đến khi ctrl + c
KBeezie

1
@KBeezie Không chắc chắn vấn đề là gì trong trường hợp của bạn. Tôi vừa thử nó trên debian wheezy và nó hoạt động tốt. Bạn có đang sử dụng bashlàm vỏ của mình không?
richk

7
Tôi thực sự thích cách tiếp cận này tốt hơn nhiều vì nó không sử dụng perl hoặc awk.
Alexey Kamenskiy

3
Để cũng thấy timeout, tất cả những gì cần thiết là phải chuyển hướng stderrtới stdouttrước ống ( |), như vậy: ping $host 2>&1 | while read pong; do echo "$(date): $pong"; done. Nếu bạn muốn ghi (hoặc nối) nó vào một tệp, bạn có thể chuyển hướng toàn bộ lệnh (sau khi hoàn tất). Ngoài ra, nếu bạn muốn không để đẻ trứng một subshell, các datehỗ trợ lệnh echoing đầu vào tùy ý, thích vậy: ping $host 2>&1 | while read pong; do date "+%c: $pong"; done. Xin lưu ý rằng formatđối số của date(bắt đầu bằng +) có thể được tùy chỉnh theo ý muốn. Xem man dateđể biết thêm thông tin.
7heo.tk

FWIW, trình bao mặc định của tôi là ZSH và nó không hoạt động. Khi tôi chạy nó trong Bash, nó hoạt động tốt. OP có đề cập đến điều đó trong đoạn đầu tiên của bình luận của anh ấy ... :)
Levi Figueira

78

Nếu AWK của bạn không có strftime():

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

Để chuyển hướng nó đến một tệp, hãy sử dụng chuyển hướng trình bao tiêu chuẩn và tắt bộ đệm đầu ra:

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

Nếu bạn muốn định dạng ISO8601 cho dấu thời gian:

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

mặc dù tôi đã xóa bộ lọc 'byte khỏi' vì tôi muốn dấu thời gian trên mọi dòng ... đặc biệt là thời gian chờ.
John Mee

Hoạt động tốt, nhưng nó ngăn chặn STDERR cho các kết quả tóm tắt ở cuối khi bạn nhấn Control + C. Vấn đề tương tự cũng tồn tại cho câu trả lời BASH.
Nicholas Blasgen

1
@NicholasBlasgen: Đó là bởi vì Ctrl-C chuyển đến quá trình cuối cùng trong đường ống và pingduy nhất nhận được a SIGPIPE. Bạn có thể sử dụng thay thế quy trình thay vì đường dẫn: ping host > >(perl -nle 'print scalar(localtime), " ", $_')và Ctrl-C sẽ chuyển đến pingvà làm những gì bạn muốn. Bạn có thể làm điều tương tự với whilevòng lặp. Nhân tiện, trên hệ thống của tôi, bản tóm tắt chuyển đến STDOUTthay vì STDERR(vì vậy nó cũng được đánh dấu thời gian).
Dennis Williamson

Câu trả lời này sẽ tốt hơn nhiều, IMHO, nếu định dạng ngày giờ ở ISO8601.
Phrogz

@Phrogz: Tôi đồng ý rằng đó là một định dạng mong muốn hơn, nhưng câu trả lời của tôi gần như khớp với những gì OP yêu cầu (tùy thuộc vào ngôn ngữ). Để có định dạng ISO8601, bạn có thể use Time::Piece; print localtime->datetime(và các cài đặt thích hợp khác) bắt đầu với 5.10 hoặc sử dụng mô-đun CPAN hoặc strftime.
Dennis Williamson

30

Từ man ping:

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

Nó sẽ tạo ra một cái gì đó như thế này:

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

Sau đó, dấu thời gian có thể được phân tích cú pháp từ pingphản hồi và chuyển đổi sang định dạng bắt buộc với date.


2
lấy làm tiếc. adsl đã bỏ ra khi tôi thêm thẻ ... đó là OSX Lion - không có tùy chọn "-D" :-(
John Mee

ai đó giỏi về perl và regex có thể chuyển cái này sang định dạng thành ngày giờ con người có thể đọc được =]
Cleber Reizen

16
  1. đầu ra thiết bị đầu cuối:

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

  2. đầu ra tệp:

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

  3. đầu cuối + đầu ra tệp:

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

  4. nền đầu ra tệp:

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


8

Nội dung gửi ban đầu của tôi không chính xác vì nó không đánh giá ngày tháng cho mỗi dòng. Chỉnh sửa đã được thực hiện.

Thử cái này

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

tạo ra sản lượng sau

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

Tùy chọn -L 1 khiến xargs xử lý từng dòng một thay vì từ.


Không in trong khoảng thời gian 'Yêu cầu hết thời gian chờ'; lưu tất cả chúng và chúng được kết xuất với cùng một dấu thời gian khi thời gian chờ yêu cầu dừng lại.
David Eison

@DavidEison thửping -D -n -O -i1 -W1 8.8.8.8
Thomas Szteliga

6

Trên macos, bạn có thể làm

ping --apple-time 127.0.0.1

Đầu ra trông giống như

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

Thử cái này:

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

Nó trả về một cái gì đó như:

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

Đưa kết quả vào awk:

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

có lời hứa! không giống như strftime vì vậy tôi đang làm việc trên đó
John Mee

Kiểm tra mã này với một loạt phi hiện tại hoặc khi lưới là xuống, tôi không hài lòng với kết quả này ;-)
Thomas Szteliga

1

Bạn không chỉ định bất kỳ dấu thời gian hoặc khoảng thời gian nào mà bạn sẽ yêu cầu đầu ra như vậy, vì vậy tôi coi nó là một vòng lặp vô hạn. Bạn có thể thay đổi nó cho phù hợp theo nhu cầu của bạn.

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

Bạn nên thay đổi grepmột phần cho `egrep '(bytes from|errors)'
rubo77

@ rubo77 bạn có thể xây dựng tại sao sử dụng 'egrep' thay vì 'grep'
Venkat Madhav

egrep chỉ để thêm một biểu hiện thường xuyên để có được một sản lượng cho các lỗi quá
rubo77

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

hoặc có thể

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

Tôi cũng cần điều này để theo dõi sự cố mạng cho sự cố hết thời gian phản chiếu cơ sở dữ liệu của tôi. Tôi sử dụng mã lệnh như sau:

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

Bạn chỉ cần sửa đổi Google.com thành tên máy chủ của mình. Nó hoạt động hoàn hảo cho tôi. và hãy nhớ dừng việc này khi bạn hoàn thành. Tệp pingtest.txt sẽ tăng 1 KB mỗi giây (xung quanh).

Cảm ơn raymond.cc. https://www.raymond.cc/blog/timestamp-ping-with-hrping/


Cập nhật: Tệp pingtest.txt sẽ tăng 4,5 KB mỗi phút (xung quanh).
DBALUKE HUANG

0

Hãy thử dòng này.

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

Bạn sẽ phải hủy nó với ctrl-ctho.


ý tưởng tốt với việc sử dụng tee, nhưng vấn đề -c 1là mất số liệu thống kê tổng thể ...
trừ đi

0

Bạn có thể tạo một hàm trong ~/.bashrctệp của mình , để bạn nhận được lệnh ping ping-ttrên bảng điều khiển của mình:

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

Bây giờ bạn có thể gọi điều này trên bảng điều khiển:

ping-t example.com

Sa 31. Mär 12:58:31 CEST 2018: PING example.com (93.184.216.34) 56 (84) byte dữ liệu.
Sa 31. Mär 12:58:31 CEST 2018: 64 byte từ 93.184.216.34 (93.184.216.34): icmp_seq = 1 ttl = 48 time = 208 ms
Sa 31. Mär 12:58:32 CEST 2018: 64 byte từ 93.184 .216.34 (93.184.216.34): icmp_seq = 2 ttl = 48 time = 233 ms

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.