"tail -f"출력을 다른 파일에 쓰기


34

에서 연속으로 내 마지막 게시물 내가 사용했다 grep & tail -f"희귀"이벤트의 발행 수를 찾을 수 있습니다. 이것을 다른 파일에 기록하고 싶습니다.

나는 선회를 시도했다

tail -f log.txt | egrep 'WARN|ERROR'

으로

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

파일이 만들어 지지만 채워지는 것은 없습니다. 캐싱 문제입니까? 아니면 그렇지 않습니까? 꼬리의 출력을 새로운 파일에 실시간으로 추가하려면 어떻게해야합니까?

답변:


44

버퍼링이 문제입니다.

이렇게하세요

tail -f log.txt | egrep --line-buffered 'WARN | ERROR'| 티 filter_output.txt
# ^^^^^^^^^^^^^^^

Cygwin에서도 작동하는 것으로 확인되었습니다.


6

아마도 버퍼링 문제 일 것입니다. 파이프 사용시 자동 버퍼 비활성화에 대한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 : unbufferCygwin의 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.


cygwin으로 이것을 달성 할 수있는 방법이 있습니까?
Mike

cygwin에서의 사용에 관한 정보를 추가했습니다. expect패키지 가 필요합니다 .
quack quixote

고마워요, 월요일까지 슬프게도 지금 시도 할 수 없습니다. 그러면 업데이트됩니다.
Mike

4

실제로 '완료'되지 않은 명령 (예 :)을 사용할 때 tail -f실제로 작동하지 않거나 전혀 작동하지 않습니다.

출력을 텍스트 파일로 리디렉션 할 수 있어야합니다. 이 시도:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt

1
작동하지 않는 것 같습니다.
Mike

2

이것은 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
}

추가 정보에 대해 +1 감사합니다. cygwin 친화적이지만 더 지능적인 스크립트처럼 보이는 경우에는 dunno입니다.
quck quixote

2

다른 사람들이 지적했듯이 unbufferExpect 의 유틸리티를 사용할 수 있습니다 .

그러나 시스템 및 사용 가능한 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/

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