На этот вопрос уже есть ответ здесь:
Мне нужна помощь, чтобы извлечь только значение времени при ping с использованием sed.
ping 192.168.1.1
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.024 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.031 ms
Итак, после использования sed я хотел бы получить следующий результат:
ping 192.168.1.1 | sed '???'
0.028
0.027
0.024
0.031
Спасибо!
С sed
можно сделать:
ping 192.168.1.1 | sed -n 's/.*time=\([^ ]*\).*/\1/p'
Это просто ищет самый длинный фрагмент непространства после time=
, круглые скобки использования для получения его так мы можем позже обратиться к нему как \1
и просто замены все на строке с тем, что было получено. -n
(не печатайте по умолчанию) наряду с /p
(распечатайте, если это работало) в конце оператора замены, гарантируют, чтобы мы только распечатали соответствующие строки.
Я не использовал бы sed
для этого, хотя, другие инструменты более просты здесь. Например:
grep
ping 192.168.1.1 | grep -Po 'time=\K\S+'
Perl
ping 192.168.1.1 | perl -lne '/time=(\S+)/ && print $1'
awk
ping 192.168.1.1 | awk -F'[= ]' '/time=/{print $(NF-1)}'
Существуют лучшие решения, чем sed для этого, я подозреваю. Следующее решение использует сокращение и возможно не очень изящно, но оно работает достаточно хорошо:
ping -c 4 -n google.com | cut -d '=' -s -f4 | cut -d ' ' -f1
Выполнение этого в реальной жизни показывает:
andrew@illium~$ ping -c 4 -n google.com | cut -d '=' -s -f4 | cut -d ' ' -f1
14.8
16.1
14.9
14.4
andrew@illium~$
Должен любить командную строку :)
Примечания:
Для ping
команда:
-c 4
: Остановитесь после отправки 4 пакетов-n
: Дайте числовую информацию только, не связанные названия адреса узлаДля первого cut
команда:
-d '='
: Используйте разделитель = знак-f4
: Выберите 4-е поле-s
: Не печатайте строки, не содержащие разделителиДля второго cut
команда:
-d ' '
: Используйте разделитель пространства ''f1
: Выберите первое поле