파이프가 파일에 쓰지 않음 [중복]

파이프가 파일에 쓰지 않음 [중복]

파일에 파이핑하지 않고 ping 명령에서 파일로 밀리초를 가져오려고 하는데 예상대로 작동합니다. 왜 > to a file이 아무 것도 쓰지 않는지 약간 혼란스럽습니다.

이것은 작동합니다:

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를 사용하는 경우 -lsed 옵션이 잘못된 것 같습니다. 아마도 -u(unbuffered) 옵션이 필요할 것입니다. 게다가 이것은 grep중복됩니다. sed에서 원하는 것을 얻을 수 있어야 합니다.

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

-n정상적인 일치 출력을 억제 하고 s///p일치하는 행을 강제로 출력합니다.

관련 정보