2012-03-09 34 views

Trả lời

26

Một cách là chỉ cần thêm một vết cắt với những gì bạn có ở đó.

ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' | cut -d '/' -f 2 
+0

thx, mà đã làm các trick . Mặc dù tôi đang tự hỏi về một cách tốt hơn với ít đường ống và cuối cùng với hiệu suất tốt hơn. – jack

+6

@jack: sau tối thiểu bốn giây để nhận dữ liệu thực tế, chi phí nhỏ trong đường ống này có thể sẽ không bao giờ quan trọng. –

6

ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print $5}' sẽ hoạt động tốt.

"-F" tùy chọn được sử dụng để xác định dấu phân cách trường.

+0

thx, có thể hợp nhất hai lệnh awk thành một không? – jack

+0

Ok. sau đó .. Tôi đang cập nhật câu trả lời .. – raj

+0

Tôi tự hỏi, liệu có thể mất gói tin nếu không phải là số không? –

3

Điều này có thể làm việc cho bạn:

ping -c 4 www.stackoverflow.com | sed '$!d;s|.*/\([0-9.]*\)/.*|\1|' 
3

Các giải pháp sau đây chỉ sử dụng Bash (yêu cầu Bash 3):

[[ $(ping -q -c 4 www.example.com) =~ \ =\ [^/]*/([0-9]+\.[0-9]+).*ms ]] \ 
&& echo ${BASH_REMATCH[1]} 

Đối với các biểu hiện thường xuyên nó dễ dàng hơn để đọc (và xử lý) nếu nó được lưu trữ trong một biến:

regex='= [^/]*/([0-9]+\.[0-9]+).*ms' 
[[ $(ping -q -c 4 www.example.com) =~ $regex ]] && echo ${BASH_REMATCH[1]} 
+0

Bạn có thể muốn thay đổi regex thành '= [^ /] */([0-9.] +). * ms' để bao gồm các giá trị trung bình mà không cần bất kỳ số thập phân. – gsbabil

0

chiết xuất trực tiếp có nghĩa là thời gian từ lệnh ping:

ping -w 4 -q www.duckduckgo.com | cut -d "/" -s -f5 

Options:

-w time out 4 seconds 
-q quite mode 
-d delimiter 
-s skip line without delimiter 
-f No. of field - depends on your system - sometimes 5th, sometimes 4th 

tôi personly sử dụng là theo cách này:

if [ $(ping -w 2 -q www.duckduckgo.com | cut -d "/" -s -f4 | cut -d "." -f1) -lt 20 ]; then 
echo "good response time" 
else 
echo "bad response time" 
fi 
Các vấn đề liên quan