Я хотел бы, чтобы вывод времени от ping был человекочитаем, в настоящее время я добираюсь:
pingn -DO 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
[1452885114.787974] no answer yet for icmp_seq=1
[1452885115.795961] no answer yet for icmp_seq=2
[1452885116.803959] no answer yet for icmp_seq=3
Я погуглил вокруг, пробуя вещи как:
pingn -DO 10.0.0.1 | sed 's/(.*)(1[0-9]{9}.[0-9]6)(.*)/echo \1 $(date -d @\2 +"%d-%m-%Y %T %z") \3/e'
но я только получаю ошибки от sed.
Спасибо,
Две ошибки:
[0-9]6
должен быть [0-9]{6}
, что означает соответствие 6 0-9
символы - части секунды.
Вы используете расширенные регулярные выражения, таким образом, необходимо использовать флаг-r с sed, для предотвращения ошибок как:
sed: -e expression #1, char 74: invalid reference \3 on `s' command's RHS
исправленные команды:
pingn -DO 10.0.0.1 | sed -r 's/(.*)(1[0-9]{9}.[0-9]{6})(.*)/echo \1 $(date -d @\2 +"%d-%m-%Y %T %z") \3/e'
И вывод будет в этом формате:
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
[ 16-01-2016 12:02:59 +0000 ] 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.28 ms
[ 16-01-2016 12:03:00 +0000 ] 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.678 ms
...
Примечание, что pingn
не нормальная команда для ping. Вы уверены, что не имеете в виду ping
?
Можно использовать что-то вроде этого, преобразовывая дату с жемчугом:
ping -DO 8.8.8.8 | perl -pe 's/(\d{10}.\d{6})/localtime($1)/e'
Подобный sed выражению, это использует 's///' формат. 1$ эквивалентен \1 sed. localtime преобразовывает числа, подобранные в завершенных круглых скобках: \d{10}.\d{6}
время эпохи (10 цифр) с микросекундами (6 цифр) снабженный суффиксом, как установлено ping -D
опция.
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[Sun Jan 17 22:47:40 2016] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=15.4 ms
[Sun Jan 17 22:47:41 2016] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=51 time=14.3 ms
[Sun Jan 17 22:47:42 2016] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=51 time=20.0 ms
[Sun Jan 17 22:47:43 2016] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=51 time=15.1 ms
[Sun Jan 17 22:47:44 2016] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=51 time=12.8 ms
Вот несколько сырое, но рабочее решение с AWK
.
ping -c 4 -DO 8.8.8.8 | awk '/^\[/ {gsub(/\[/,"");gsub(/\]/,""); CMD="echo "$1"|date"; system(CMD); for(i=2;i<=NF;i++) printf(" %s ",$i); printf("\n") } /---/,/rtt min/{print}'
Демонстрационный вывод:
$ ping -c 4 -DO 8.8.8.8 | awk '/^\[/ {gsub(/\[/,"");gsub(/\]/,""); CMD="echo "$1"|date"; system(CMD); for(i=2;i<=>
Sun Jan 17 23:24:35 MST 2016
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=44.1 ms
Sun Jan 17 23:24:36 MST 2016
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=41.6 ms
Sun Jan 17 23:24:37 MST 2016
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=41.4 ms
Sun Jan 17 23:24:38 MST 2016
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=49.9 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 41.470/44.294/49.976/3.455 ms