파일에 파이핑하지 않고 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를 사용하는 경우 -l
sed 옵션이 잘못된 것 같습니다. 아마도 -u
(unbuffered) 옵션이 필요할 것입니다. 게다가 이것은 grep
중복됩니다. sed에서 원하는 것을 얻을 수 있어야 합니다.
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
-n
정상적인 일치 출력을 억제 하고 s///p
일치하는 행을 강제로 출력합니다.