![“sed”重写文件以显示整数并删除剩余字符](https://linux22.com/image/108423/%E2%80%9Csed%E2%80%9D%E9%87%8D%E5%86%99%E6%96%87%E4%BB%B6%E4%BB%A5%E6%98%BE%E7%A4%BA%E6%95%B4%E6%95%B0%E5%B9%B6%E5%88%A0%E9%99%A4%E5%89%A9%E4%BD%99%E5%AD%97%E7%AC%A6.png)
我的目标是生成一个输出,可用于根据 5 个服务器 ping 得出平均值。我在跑:
ping 8.8.8.8 -c 5 > ping.txt
输出
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=46 time=29.331 ms
64 bytes from 8.8.8.8: seq=1 ttl=46 time=34.057 ms
64 bytes from 8.8.8.8: seq=2 ttl=46 time=33.978 ms
64 bytes from 8.8.8.8: seq=3 ttl=46 time=33.629 ms
64 bytes from 8.8.8.8: seq=4 ttl=46 time=48.414 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 29.331/35.881/48.414 ms
然后,我的目标是删除每次 ping 服务器的时间周围的文本数据(以毫秒为单位),目前,我有:
sed 's/".*time=//' ping.txt > pingres.txt
这并没有完全删除我需要的所有数据并输出如下:
PING 8.8.8.8 (8.8.8.8): 56 data bytes
29.331 ms
34.057 ms
33.978 ms
33.629 ms
48.414 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 29.331/35.881/48.414 ms
我想用以下方式显示数据,但忘记了 sed 实现此目的的一些原理,而且我还是个新手。
29.331
34.057
33.978
33.629
48.414
我意识到,文件底部已经标记了平均值,但出于其他原因我需要此方法
答案1
您可以进行更多过滤以grep
限制您正在查看的行:
$ ping 127.0.0.1 -c 5 | grep "bytes from" | sed -n -e 's/^.*time=//' -n -e 's/[^0-9\.].*$//p'
0.020
0.040
0.054
0.036
0.049
答案2
grep -m5 -oP '\stime=\K\d+\.\d+(?=\s+ms$)' ping.text
sed -ne '2,6s/.* time=\([^ ]*\) ms/\1/p' ping.text