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

У этого вопроса уже есть ответ: Как написать awk-скрипт, который поймает время ping 2 ответа

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

6 ответов

С помощью sed вы можете сделать:

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

Это просто ищет самый длинный участок без пробела после time=, использует скобки для его захвата, чтобы мы могли позже ссылаться на него как \1 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /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)}'
7
ответ дан 22 May 2018 в 20:15
  • 1
    @ Ana.B Вы можете подумать о принятии ответа, нажав на серый тик. Если вы считаете, что это было полезно для вас. – Ravexina 24 July 2017 в 13:04

С помощью sed вы можете сделать:

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

Это просто ищет самый длинный участок без пробела после time=, использует скобки для его захвата, чтобы мы могли позже ссылаться на него как \1 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /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)}'
7
ответ дан 18 July 2018 в 09:47

С помощью sed вы можете сделать:

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

Это просто ищет самый длинный участок без пробела после time=, использует скобки для его захвата, чтобы мы могли позже ссылаться на него как \1 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /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)}'
7
ответ дан 24 July 2018 в 19:26

Есть лучшие решения, чем sed для этого, я подозреваю. Следующее решение использует cut и, возможно, не очень изящно, но оно работает достаточно хорошо:

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: выберите четвертое поле -s: не печатайте строки, не содержащие разделителей. Для второй команды cut: -d ' ': Используйте разделитель пробела '' f1: выберите первое поле
2
ответ дан 22 May 2018 в 20:15

Есть лучшие решения, чем sed для этого, я подозреваю. Следующее решение использует cut и, возможно, не очень изящно, но оно работает достаточно хорошо:

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: выберите четвертое поле -s: не печатайте строки, не содержащие разделителей. Для второй команды cut: -d ' ': Используйте разделитель пробела '' f1: выберите первое поле
2
ответ дан 18 July 2018 в 09:47

Есть лучшие решения, чем sed для этого, я подозреваю. Следующее решение использует cut и, возможно, не очень изящно, но оно работает достаточно хорошо:

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: выберите четвертое поле -s: не печатайте строки, не содержащие разделителей. Для второй команды cut: -d ' ': Используйте разделитель пробела '' f1: выберите первое поле
2
ответ дан 24 July 2018 в 19:26

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

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