tail 출력을 파일로 리디렉션한 다음 일치하는 항목이 발견되면 중지합니다.

tail 출력을 파일로 리디렉션한 다음 일치하는 항목이 발견되면 중지합니다.

이 로그 파일을 사용하면 데이터가 지속적으로 들어옵니다. 내가 원하는 것은 이 로그 파일을 tail -f로 처리한 다음 ff 조건이 있는 파일로 리디렉션하는 것입니다.

로그 파일 내용의 예

aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
ccccccccccccccc
ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh
iiiiiiiiiiiiiii

테일링에서는 첫 번째 패턴이 발견되면 리디렉션이 시작되고, 두 번째 패턴이 발견되면 리디렉션과 테일링이 중지되기를 원합니다. 예를 들어

"dddddddddddd" 패턴이 발견되면 리디렉션이 시작되고 "hhhhhhhhhhhhhhhh" 패턴이 발견되면 리디렉션을 중지하고 싶습니다. 리디렉션에서 생성된 파일의 내용은 다음과 같아야 합니다.

ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh

코딩을 하면서 이런 생각을 했습니다. 하지만 두 번째 패턴이 발견되면 리디렉션을 중지하는 방법을 모르겠습니다.

tail -f logfile > log.tmp
while grep "ddddddddddddddd" log.tmp
do
cat log.tmp > logfile
done

답변1

이것이 바로retail하다. retailtail은 정규식이 포함된 도구로, 여기에서 귀하의 사용 사례를 위해 작성한 도구입니다. 귀하의 경우에는 다음을 사용합니다.

retail -f -r ddddddddddddddd -u hhhhhhhhhhhhhhh logfile > log.tmp

-f표준 tail -f옵션입니다. -r포함할 줄 범위를 시작하는 정규식과 -u계속하려면 정규식을 허용합니다. 그것은 시작한다마지막패턴이 나타나고 -r인쇄 후 종료됩니다.첫 번째-u패턴은 그 이후에 나타났다.

패턴의 첫 번째 인스턴스부터 시작하려면 -b와 함께 사용할 수 있습니다 -r. 두 정규식은 모두오히려, 암시적 앵커링은 없지만 평소와 같이 및 일치 항목을 앵커하는 데 ^사용할 수 있습니다.$


retail다음을 통해 얻고 빌드 할 수 있습니다 .

git clone https://github.com/mwh/retail.git
cd retail
./configure
make
make install

~/.local/bin기본적으로 설치되어 있지만 변경하거나 원하는 위치에 실행 파일을 복사할 수 있습니다.


retail완전히POSIX 호환하지만 실제로 시스템에 사용하는 것은 권장하지 않습니다 tail.

답변2

귀하의 요구 사항을 올바르게 이해하면 다음과 같은 결과가 나올 것입니다.

awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' infile | tail -f

awk"infile" 파일에 대한 필터 역할을 하며 지정된 패턴 사이의 모든 내용을 "extract" 파일에 인쇄하고 각 줄을 표준 출력으로 인쇄한 다음 tail -f평소대로 처리합니다.

스트리밍 데이터와 함께 사용하려면:

some_process | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1'  | tail -f

(참고: tail -f이는 대화형 프로그램이므로 가능하면 항상 파이프라인에 나타나야 합니다.)

답변3

어쩌면 awk여기에서 범위 모드를 사용할 수도 있습니다.

tail -f logfile | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/'

이 문제를 피해야 하는 경우 대신 SIGPIPE다음 방법을 사용 하여 작업을 socat수행 할 수 있습니다.tail

socat -u file:logfile,ignoreeof "system:'stdbuf -o0 awk /ddddddddddddddd/,/hhhhhhhhhhhhhhh/'" > logfile.new

관련 정보