Мне нужна помощь, чтобы извлечь только значение времени при пинге с помощью 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 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /p (печать, если это сработало) в конце оператора замещения гарантирует, что мы будем печатать только соответствующие строки.
Я бы не использовал sed для этого, но другие инструменты здесь проще. Например:
grepping 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 192.168.1.1 | sed -n 's/.*time=\([^ ]*\).*/\1/p'
Это просто ищет самый длинный участок без пробела после time=, использует скобки для его захвата, чтобы мы могли позже ссылаться на него как \1 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /p (печать, если это сработало) в конце оператора замещения гарантирует, что мы будем печатать только соответствующие строки.
Я бы не использовал sed для этого, но другие инструменты здесь проще. Например:
grepping 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 192.168.1.1 | sed -n 's/.*time=\([^ ]*\).*/\1/p'
Это просто ищет самый длинный участок без пробела после time=, использует скобки для его захвата, чтобы мы могли позже ссылаться на него как \1 и просто заменяет все на линии тем, что было захвачено. [F8] (не печатать по умолчанию) вместе с /p (печать, если это сработало) в конце оператора замещения гарантирует, что мы будем печатать только соответствующие строки.
Я бы не использовал sed для этого, но другие инструменты здесь проще. Например:
grepping 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 для этого, я подозреваю. Следующее решение использует 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: выберите первое полеЕсть лучшие решения, чем 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: выберите первое полеЕсть лучшие решения, чем 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: выберите первое поле