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 '^[^ ]*'
이것을 따르면 더 많은 정보와 해결 방법(솔루션?)이 있습니다.협회