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
일치하는 라인의 출력을 강제합니다.