"sed"는 파일을 다시 작성하여 정수를 표시하고 나머지 문자를 제거합니다.

"sed"는 파일을 다시 작성하여 정수를 표시하고 나머지 문자를 제거합니다.

내 목표는 5개의 서버 핑을 기반으로 평균을 도출하는 데 사용할 수 있는 출력을 생성하는 것입니다. 나는 뛰고있어:

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

내 목표는 서버에 대한 각 핑 시간(밀리초)의 텍스트 데이터를 제거하는 것입니다. 현재 다음과 같습니다.

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

관련 정보