我需要帮助来仅提取使用 sed 执行 ping 时的时间值。
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
谢谢你!
答案1
你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)}'
答案2
我认为对于这个问题有比 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
:选择第 4 个字段-s
:不打印不包含分隔符的行
对于第二条
cut
命令:-d ' '
:使用空格分隔符 ' 'f1
:选择第一个字段