이 로그 파일을 사용하면 데이터가 지속적으로 들어옵니다. 내가 원하는 것은 이 로그 파일을 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
하다. retail
tail은 정규식이 포함된 도구로, 여기에서 귀하의 사용 사례를 위해 작성한 도구입니다. 귀하의 경우에는 다음을 사용합니다.
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