Tail Grep - 패턴이 일치할 때까지 주변 선을 인쇄합니다.

Tail Grep - 패턴이 일치할 때까지 주변 선을 인쇄합니다.

이것이 나의 요청입니다.

로그 파일을 따라가서 greping하고 있습니다.
각 grep 결과에 대한 컨텍스트를 얻고 싶습니다.
그러나 컨텍스트는 grep -A/-B/-C제공되는 행 수 대신 "패턴이 일치할 때까지"여야 합니다.

예를 들어
이것이 내 로그라고 가정해 보세요.

[l]각 로그 줄의 접두사입니다. 또한, [logTypeA]접두사 또는 접두사 도 있습니다.[logTypeB]

[l][logTypeA] - Log line 1
[l][logTypeB] - Log line 2 
[l][logTypeA] - Log line 3 
.... 

Random data about Log line 3
....

[l][logTypeB] - Log line 4

이제 내 tail명령이 이면 tail -f log_file.log | grep "[logTypeA]"출력이 표시됩니다.

[l][logTypeA] - Log line 1
[l][logTypeA] - Log line 3 

하지만 grep 결과에 대한 컨텍스트 정보가 필요하며 해당 컨텍스트는 몇 개의 행이 아니라 특정 패턴이 일치할 때까지(이 경우에는 [l]).

이 예에서 나는 grep 결과를 다음과 같이 만들고 싶습니다.

[l][logTypeA] - Log line 1
[l][logTypeA] - Log line 3 
.... 

Random data about Log line 3
....

여기에서(다른 특정 일치까지 각 grep 일치 후에 줄을 표시하는 방법은 무엇입니까?sed), 다음과 같은 명령을 시도했습니다.tail

tail -f log_file.log | sed '/\[logTypeA\]/,/\[l\]/p'

그러나 이것은 작동하지 않는 것 같습니다.

어떤 아이디어가 있나요?

답변1

이는 Awk에서 매우 일반적인 패턴입니다. 관련 행을 모아 '레코드'로 만들고, 모든 레코드를 수집한 후 특정 조건이 충족되면 레코드를 인쇄합니다.

tail -f file |
awk '/\[l]/ { if (p && stored) print stored; stored = ""; p=0 }
    /\[logTypeA]/ { p=1 }
    { stored = stored (stored ? ORS : "") $0 }
    END { if (p) print stored }'

END끝이 없는 스트림의 경우 조건은 실제로 의미가 없지만 tail -f테스트 중인 마지막 레코드를 인쇄해야 할 때 좋은 측정과 성가신 테스트 실패를 피하기 위해 조건을 포함했지만 이 END조항 없이는 포함하지 않았습니다.

답변2

아마도 이 작업을 수행하기 위해 Perl 문을 사용하게 될 것입니다. sed에서 이 작업을 수행할 수 있지만 sed의 "의도하지 않은 Turing 완전성" 부분에 도달하기 시작한 것처럼 느껴집니다.

Perl 한 줄( perl -ne이것이 진짜 요점입니다)

echo  '[l] boring\nboring data\n[l] boring\n[l]interesting\ndata\ndata\n[l]boring' |  perl -ne '
    if (/\[l\].*interesting/ ) { print $_; $collect=1 ; }
    elsif (/\[l\]/) {$collect=0 }
    elsif ($collect) {print $_}'

참고로 다음은 동일한 작업을 수행하는 한 줄의 sed 코드입니다. (사용된 sed의 기능:두번째전환을 달성하려면,시간조건부 실행을 구현하기 위해).

echo  '[l] boring\nboring data\n[l] boring\n[l\]interesting\ndata\ndata\n[l]boring' |  sed -nE '/\[l\].*interesting/ {
p;
s/.*/collect/ ; x ; # store collect marker in the pattern space
b; # terminate processing
}

/\[l\]/ {
s/.*// ; x; # clear hold flag
b
}

/./ {
x;
s/collect/collect/;
T; x; p # print if we are collecting
}
'

관련 정보