로그 파일에서 텍스트 블록을 제거하는 방법은 무엇입니까? [폐쇄]

로그 파일에서 텍스트 블록을 제거하는 방법은 무엇입니까? [폐쇄]

다음 로그가 있습니다.

2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

이 줄을 삭제하고 싶지만 ApplicationState이 줄 끝에 패턴이 없습니다 Blah Blah Blah.

제가 제거하고 싶은 블록은 다음과 같습니다:

2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah

다음 요청이 시작되기 전에.

답변1

일치 항목 앞에 나타나는 줄을 포함하여 1부터 시작하는 줄의 전체 블록을 다음 줄이 나타날 때까지 제거하려면 [T1114Base다음을 수행할 수 있습니다.

sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out

이것이 어떻게 작동하는지 이해하는 것은 매우 간단합니다. 기본적으로 sed입력은 한 번에 한 줄씩 먹습니다. 하지만 더 넓은 관점을 원한다면 스크립트를 작성하면 됩니다.

!따라서 각 입력 라인에 대해 현재 라인이 마지막 라인 이 아닌 경우 삽입된 줄 바꿈 문자로 구분된 패턴 공간 에 $추가 라인이 추가됩니다 .sedN\n

범위 표현식에서 먼저 일치하는 항목을 찾습니다.ApplicationState그 뒤에는 *임의 개수의 .문자가 오고 그 뒤에는 적어도 하나의 \n줄줄이 옵니다. 범위 표현식을 끝내려면 $!N우선 목적인 입력을 살펴봐야 합니다 . sed다음 행 발생을 스캔합니다.뒤쪽에마지막으로 삭제할 항목입니다. \n다음 입력 블록의 시작 부분과 일치해야 하는 패턴이 뒤따르는 ewline을 찾습니다 .

범위 표현식이 !일치하지 않으면 패턴 공간에서 첫 번째 개행 문자가 인쇄 sed되고 , 일치 여부와 상관없이 패턴 공간에서 첫 번째 개행 항목이 제거 되고 다음 과 같이 스크립트의 맨 위로 재활용됩니다. 나머지 .P\nsedD

기본적 sed으로 입력된 2줄을 동시에 스와이프하면 P삭제 블록에 나타나지 않는 경우 가장 오래된 줄이 인쇄될 수 있으며 D확장을 추가하기 전에 항상 가장 오래된 줄만 삭제합니다 N.

답변2

정말 시도해 보셨나요?

전체 행을 삭제한다고 가정해 보겠습니다.

sed '/ApplicationState/d' inputfile

관련 정보