从终端提取值

从终端提取值

我需要帮助来仅提取使用 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这个,其他工具更简单。例如:

  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)}'
    

答案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~$ 

我非常喜欢命令行:)

笔记:

  1. 对于ping命令:

    • -c 4:发送4个数据包后停止
    • -n:仅提供数字信息,而不是主机地址的相关名称
  2. 对于第一个cut命令:

    • -d '=':使用 = 符号分隔符
    • -f4:选择第 4 个字段
    • -s:不打印不包含分隔符的行
  3. 对于第二条cut命令:

    • -d ' ':使用空格分隔符 ' '
    • f1:选择第一个字段

相关内容