2011-03-31 2 views
1

몇 가지 필터를 통해 테일 아파치 오류 로그를 작성하려고합니다.CLI 프로그램간에 출력을 파이프 할 때의 버퍼링 문제

이 완벽하게 작동합니다 :

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" 

하지만 거기에 몇 가지 문자 "\ n"나는 펄에 I 파이프 그래서 실제 새로운 라인으로 교체하려는 출력 :

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | perl -ne 's/\\n/\n/g; print"$_"' 

이것은 캐싱 문제 (첫 번째 페이지 히트는 아무것도 생성하지 않고 두 번째 페이지 히트와 두 개의 디버깅 정보가 나옵니다)가있는 것 같습니다. 또한 약간의 임시적인 것으로 보입니다.

그래서 내가 나오지도 시도 : 같은 문제를 고통을 보인다

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | sed 's/\\n/\n/g' 

합니다.

답변

4

대부분의 프로그램을 파일이나 파이프로 사용하면 출력을 버퍼링합니다. 어떤 경우에는 이것을 제어 할 수 있습니다 : GNU grep 패밀리는 --line-buffered 옵션을 허용합니다. 특히 이와 같은 파이프 라인에 사용됩니다. 또한 Perl에서는 동일한 효과로 $| = 1;을 사용할 수 있습니다. (sed에는 알고있는 그런 옵션이 없습니다.)

이것은 버퍼링 될 파이프 라인의 시작 부분이나 중간 부분에있는 것이지, 끝 부분은 아닙니다. 줄을 버퍼링해야 함) egrep --line-buffered을 사용하고 싶습니다. 당신이 -u 사용할 수 있습니다처럼

+0

Perfect! 감사. – aidan

관련 문제