Извлечь значения из терминала [дубликат]

На этот вопрос уже есть ответ здесь:

Мне нужна помощь, чтобы извлечь только значение времени при 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

Спасибо!

4
задан 24 July 2017 в 13:10

2 ответа

С sed можно сделать:

ping 192.168.1.1 | sed -n 's/.*time=\([^ ]*\).*/\1/p'

Это просто ищет самый длинный фрагмент непространства после time=, круглые скобки использования для получения его так мы можем позже обратиться к нему как \1 и просто замены все на строке с тем, что было получено. -n (не печатайте по умолчанию) наряду с /p (распечатайте, если это работало) в конце оператора замены, гарантируют, чтобы мы только распечатали соответствующие строки.

Я не использовал бы sed для этого, хотя, другие инструменты более просты здесь. Например:

  1. grep

    ping 192.168.1.1 | grep -Po 'time=\K\S+'
    
  2. Perl

    ping 192.168.1.1 | perl -lne '/time=(\S+)/ && print $1'
    
  3. awk

    ping 192.168.1.1 | awk -F'[= ]' '/time=/{print $(NF-1)}'
    
7
ответ дан 1 December 2019 в 09:02

Существуют лучшие решения, чем 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~$ 

Должен любить командную строку :)

Примечания:

  1. Для ping команда:

    • -c 4: Остановитесь после отправки 4 пакетов
    • -n : Дайте числовую информацию только, не связанные названия адреса узла
  2. Для первого cut команда:

    • -d '=': Используйте разделитель = знак
    • -f4 : Выберите 4-е поле
    • -s : Не печатайте строки, не содержащие разделители
  3. Для второго cut команда:

    • -d ' ' : Используйте разделитель пространства ''
    • f1 : Выберите первое поле
2
ответ дан 1 December 2019 в 09:02

Другие вопросы по тегам:

Похожие вопросы: