grep이 리디렉션에서 작동하지 않는 이유는 무엇입니까? > top.log 이제 grep을

top리디렉션과 함께 명령을 사용하면 정상적으로 작동합니다.

top > top.log

이제 grep을 사용하여 특정 줄을 필터링하고 싶습니다.

top | grep "my_program" > top.log

그러나 로그 파일은 비어 있습니다. 그러나 grep은 사용할 때 출력을 제공합니다.

top | grep "my_program"

어디에서 my_program어떤 출력을 볼 수있는 실행 프로그램으로 대체되어야한다.

왜 내 접근 방식이 작동하지 않습니까? 어떻게 해결할 수 있습니까?



답변

나는 당신이 묘사하는 것과 같은 행동을합니다. 우분투 11.10에서

top | grep "my_program" > top.log

출력을 생성하지 않습니다.

그 이유는 grep이 출력을 버퍼링하기 때문입니다. GNU grep에게 출력을 한 줄씩 뱉어 내려면 다음 --line-buffered옵션을 사용하십시오 .

top | grep --line-buffered "my_program" > top.log

다른 잠재적 인 솔루션에 대해서는 이 SO 질문 을 참조하십시오 .


답변

당신은 사용해야합니다 :

top -n 1 | grep "blah" > top.log

“-n 1″은 1 회 반복 실행 된 다음 몇 초마다 계속 업데이트되는 대신 종료됩니다.

ps를 사용하는 것이 더 좋은 도구이지만 한 줄만 찾고 있기 때문입니다.


답변

이 문제에 대한 내 해결 방법은 다음과 같습니다.

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

이런 식으로 my_program의 백그라운드에서 모니터를 실행하고 모든 결과를 top.log 파일에 유지할 수 있습니다.


답변

이 시도:

top | grep "my_program" 2>&1 > top.log

무슨 뜻 2>&1입니까?


답변

둘 다 나를 위해 일하지만 Lev Levitsky의 조언이 올바른 것이라고 생각합니다. -b인수를 사용하십시오 .

출력 리디렉션이 문제이고 stdout을 통해 아무것도 얻지 못할 가능성이 있으므로 대신 다음을 시도하십시오.

top -b 2>&1 | grep "my_program" > top.log

출력 버퍼링에도 문제가있을 수 있습니다. 쉘은 파일에 지속적으로 쓰지 않으므로 top.log채우는 데 시간이 걸릴 수 있습니다 .