grep이 리디렉션에서 작동하지 않는 이유는 무엇입니까?


15

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

top > top.log

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

top | grep "my_program" > top.log

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

top | grep "my_program"

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

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

bash  grep 

2
방금 시도해 보았습니다. 그러나 -b옵션을 top보거나 ps대신 사용해야 합니다.
Lev Levitsky

-b내 문제를 해결하지 못했지만 일부 인코딩 문제를 해결했습니다. 감사합니다.

답변:


22

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

top | grep "my_program" > top.log

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

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

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

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


3
+1 --line-buffered은 문제를 해결합니다.

감사합니다. 이것도 문제를 해결합니다. 이 -b옵션은 여전히 ​​Lev Levitsky의 좋은 조언입니다. 로그 파일의 일부 인코딩 문제가 해결되었습니다.

2

당신은 사용해야합니다 :

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

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

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


1

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

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

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



0

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.