「sed」はファイルを書き換えて整数を表示し、残りの文字を削除します。

「sed」はファイルを書き換えて整数を表示し、残りの文字を削除します。

私の目標は、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

関連情報