파이프가 파일에 쓰지 않습니다.

파이프가 파일에 쓰지 않습니다.

ping 명령에서 파일로의 ms 수만 가져오고 싶습니다. 파일에 파이핑하지 않고 의도한 대로 작동합니다. > 파일에 아무 것도 쓰지 않는 이유가 무엇인지 조금 알 수 없습니다.

이것은 작동합니다:

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'

이것은 ping.dat에 아무 것도 쓰지 않습니다.

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

각각은 |잠재적으로 stdio 출력 버퍼와 stdin 입력 버퍼로 둘러싸여 있습니다. 실시간 파이핑을 얻으려면 그중 어느 것을 꺼야 하는지 알아내야 합니다.

이것은 나에게 효과적입니다.

ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file

처음에는 모든 명령 앞에 입력한 stdbuf -i0 -o0다음 불필요한 명령을 알아냈습니다.

답변2

GNU를 사용하고 있다면 sed에 대한 옵션이 잘못된 것 같습니다 . 아마도 (버퍼링되지 않은) 옵션을 -l원할 것입니다 . -u또한 grep불필요합니다. sed에서 원하는 것을 얻을 수 있어야 합니다.

ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out

-n정상적인 일치 출력을 억제하는 반면, s///p일치하는 라인의 출력을 강제합니다.

관련 정보