답변:
아마도 버퍼링 문제 일 것입니다. 파이프 사용시 자동 버퍼 비활성화에 대한 이 SO 게시물을 참조하십시오 . 다음에서 unbuffer
명령을 사용할 수 있습니다 expect
.
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
편집 : 파이프 라인이 더 길기 때문에 각 명령의 버퍼를 해제해야합니다 (마지막 제외).
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
편집 2 : unbuffer
Cygwin의 expect
소스 패키지 (예 : 폴더 에있는 expect-20030128-1-src.tar.bz2expect/examples
)에서 사용할 수 있지만 매우 짧은 스크립트입니다. 당신이있는 경우 expect
이미 설치 패키지를 단순히라는 스크립트에이를 넣어 unbuffer
당신의 /usr/local/bin
디렉토리 :
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
데비안에서는 unbuffer
명령이 expect-dev
패키지에 제공되며로 설치됩니다 expect_unbuffer
.
expect
패키지 가 필요합니다 .
이것은 unbuffer
내가 가진 버전입니다 .
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
if {[string compare [lindex $argv 0] "-p"] == 0} {
# pipeline
set stty_init "-echo"
eval spawn -noecho [lrange $argv 1 end]
close_on_eof -i $user_spawn_id 0
interact {
eof {
# flush remaining output from child
expect -timeout 1 -re .+
return
}
}
} else {
set stty_init "-opost"
set timeout -1
eval spawn -noecho $argv
expect
}
다른 사람들이 지적했듯이 unbuffer
Expect 의 유틸리티를 사용할 수 있습니다 .
그러나 시스템 및 사용 가능한 Expect 버전에 따라 -p
스위치를 사용하여 버퍼 해제 해야 할 수도 있습니다 . 매뉴얼 페이지 인용 :
Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations. To use unbuffer in a pipeline, use
the -p flag. Example:
process1 | unbuffer -p process2 | process3
따라서이 호출이 필요할 수 있습니다.
unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt
BTW, 출력 버퍼링 문제에 대한 자세한 설명은이 기사를 참조하십시오. http://www.pixelbeat.org/programming/stdio_buffering/