대규모 로그 파일에서 텍스트 및 바이너리 발췌문을 제거하는 셸 스크립트 또는 명령

대규모 로그 파일에서 텍스트 및 바이너리 발췌문을 제거하는 셸 스크립트 또는 명령

매일 생성되는 대용량 로그 파일에서 대용량 바이너리 파일(PDF 파일)을 제거해야 합니다. 이는 우리 서버에서 많은 공간을 차지합니다. 로그를 더 작고 관리하기 쉽게 만들기 위해 로그에서 큰 PDF를 제거해야 합니다.

문자열 사이의 텍스트(또는 바이너리)를 꺼내야 합니다.

  • <my:PDF>그리고</my:PDF>
  • <applicationForm>그리고</applicationForm>
  • <image>그리고</image>
  • <extractedSignature>그리고</extractedSignature>

sed 유틸리티가 이 작업을 수행할 수 있는지 확실하지 않습니다. 이러한 파일은 크기가 커서 잘라야 합니다. 나는 로그 회전 조언을 찾고 있는 것이 아니라 위의 문자 사이에 있는 이러한 큰 텍스트 로그를 제거할 수 있는 스크립트나 명령만 찾고 있습니다. 나는 무엇을 해야할지 모르겠습니다. 이 파일은 상당히 큽니다. 이를 달성하기 위해 sed, tail, head, tr 또는 기타 도구를 사용하는 방법을 모르겠습니다.

답변1

로그 파일이 실제로 XML 형식인 것 같습니다. 그렇다면 어떻게 해야 할까요?진짜당신이 해야 할 일은 XML 파서를 사용하는 것입니다. 읽다이 유명한 StackOverflow 답변더 많은 정보를 알고 싶다면.

설명에 따르면 SAX 기반 파서가 아마도 최선의 선택일 것입니다. 이는 전체 파일을 메모리에 로드할 필요가 없는 스트림 지향 파서입니다. XML에서 매우 간단한 변환만 수행하므로 XSLT가 아마도 매우 좋은 후보일 것입니다(사용하면 속도가 빨라질 것입니다).xsltproc에서 libxslt). 이것은잠재적으로 관련 기술을 보여주는 SO 답변.

답변2

start// 및 // 패턴 사이에 여러 줄이 있는 경우 end범위 합계를 사용할 수 있습니다 d.

일반적으로 말하면

/start/,/end/d

// 와 //(포함) start사이의 모든 줄이 end삭제됩니다.

파일을 만들고 다음 줄을 추가한 후 somefile로 저장하세요.

/<\"my:PDF\">/,/<\"\/my:PDF\">/d
/<\"applicationForm\">/,/<\"\/applicationForm\">/d
/<\"image\">/,/<\"\/image\">/d
/<\"extractedSignature\">/,/<\"\/extractedSignature\">/d

그런 다음 이렇게 사용하십시오

sed -f somefile logfile >prunedfile

답변3

sed를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

cat LOG | sed -e "s/<\"my:PDF\">.*<\/\"my:PDF\">/<\"my:PDF\"><\/\"my:PDF\">/g;" > LOGx

본질적으로 이것은 " <"my:PDF">패턴 뒤에 임의의 수의 문자가 뒤따르고 패턴이 뒤따르는 패턴을 찾아 </"my:PDF">패턴으로 대체합니다 <"my:PDF"></"my:PDF">. 이 작업을 전역적으로 수행합니다"를 의미합니다.

교체해야 하는 다른 문자열에 대해 필요에 따라 이 작업을 반복합니다.

답변4

활동 로그를 편집하는 것은 까다롭고 위험하므로 서비스가 중단될 때까지 기다려야 합니다. 이것이 가능하지 않은 경우 로깅 프로그램이 파일에 쓰는 대신 출력을 필터에 전달할 수 있는지 확인할 수 있습니다. 그러면 정보가 디스크에 기록되기 전에 필터가 원하지 않는 항목을 제거할 수 있습니다. 필터 사망 로그 항목이 손실되므로 이는 약간 더 위험합니다.

불행하게도 sed 정규식은 "탐욕적"입니다. 단일 로그 줄에 삭제하려는 필드가 두 개 이상 있으면 sed는 그 사이의 모든 항목을 삭제합니다.

<"my:PDF">.*?<"/my:PDF"><"keeper">.*?<"/keeper"><"my:PDF">.*?</my:PDF">

-p 옵션(man perlrun 참조)을 사용하면 Perl은 sed와 매우 유사하게 작동할 수 있지만 탐욕스럽지 않은 정규 표현식(*?의 ?)을 요청할 수 있습니다.

펄 -p -e '\
    s|<"my:PDF">.*?<"/my:PDF">||g;
    s|<"applicationForm">.*?<"/applicationForm">||g;
    s|<"Picture">.*?<"/Picture">||g;
    s|<"extractedSignature">.*?<"/extractedSignature">||g;
           ' 거대한.log > 거대한.log~ && \
MV 거대.로그~ 거대.로그

관련 정보