여러 파이프를 통한 ping 출력 필터링이 실패합니다.

여러 파이프를 통한 ping 출력 필터링이 실패합니다.

ping출력에서 패킷 반환 시간 만 캡처하려고 하면 다음과 같은 문제가 발생합니다.

$ ping 192.168.0.1 | grep -o '[^ =]* ms'

각 패킷의 도착 시간을 표시하여 작동합니다. 시간 단위도 제거하고 싶기 때문에 이것으로 충분할 것이라고 생각했습니다.

$ ping 192.168.0.1 | grep -o '[^ =]* ms' | grep -o '^[^ ]*'

그러나 놀랍게도 출력이 표시되지 않고 중단됩니다. 그러나 echo첫 번째 명령을 출력의 예제 줄로 바꾸면 ping예상대로 작동합니다( 출력 5.07).

$ echo '64 bytes from 192.168.0.1: icmp_seq=10 ttl=64 time=5.07 ms' | grep -o '[^ =]* ms' | grep -o '^[^ ]*'

밀리초 단위 없이 시간을 얻는 다른 방법을 찾았지만 여전히 ping명령에 무슨 문제가 있습니까? 하나의 파이프를 통해서는 괜찮지만 두 개의 파이프를 통해서는 괜찮지 않은 이유는 무엇입니까?

추신: 아래 버전도 실패하지만 해당 echo버전은 성공하므로 문제가 발생할 수 없습니다.grep

$ ping 192.168.0.1 | grep -o '[^ =]* ms' | sed 's_ ms__'
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | cut -f 1 -d ' '
$ ping 192.168.0.1 | cut -f 7 -d ' ' | cut -f 2 -d '='

답변1

확실한 대답은라인 버퍼. ping -c 3를 사용하는 대신 ping첫 번째 명령이 완료될 때만 모든 출력이 생성되는 를 사용하여 이를 시연 할 수 있습니다 .

GNU에 대한 해결 방법으로 grep두 개의 필터를 하나로 줄일 수 있습니다

ping 192.168.0.1 | grep -oP '[[:digit:].]+(?= ms)'

또는 정말로 두 필터를 모두 사용하고 싶다면 grep --line-buffered ...또는 중 하나 stdbuf -oL grep ...가 적합할 것입니다.

답변2

귀하의 문제는 쉘의 라인 버퍼링으로 인해 발생한 것 같습니다.

명령을 충분히 오랫동안 실행하면 일부 출력이 표시됩니다.
또는 다음과 같이 핑 수를 제한하십시오.

$ ping -c4 192.168.0.1 | grep -o '[^ =]* ms' | grep -o '^[^ ]*'

이것을 따르면 더 많은 정보와 해결 방법(솔루션?)이 있습니다.협회

관련 정보