파일의 특정 부분을 검색한 다음 해당 부분에서 관련 정보만 추출하려면 어떻게 해야 합니까?

파일의 특정 부분을 검색한 다음 해당 부분에서 관련 정보만 추출하려면 어떻게 해야 합니까?

약 1000줄의 정보가 포함된 서버 보고서인 텍스트 파일이 있습니다. 내가 찾고 있는 일부 정보에 대해 보고서를 검색할 수 있는 스크립트를 작성하려고 합니다.

예를 들어:

서버 1 상태 확인

날짜 - 오류 횟수


2015년 6월 25일:14

2015년 6월 24일: 이십 일

2015년 6월 23일: 번호 17

2015년 6월 24일: 33

서버 2 상태 확인

날짜 - 오류 횟수


2015년 6월 25일:4

2015년 6월 24일: 13

2015년 6월 23일: 이십 일

2015년 6월 24일: 33

X로 인한 오류


서버 1:

32

서버 2:

스물넷

이 세 부분은

  • "서버 상태 점검 1",
  • "서버 상태 점검 2" 및
  • "x로 인해 발생한 오류입니다."

추출해야 하는 각 섹션의 데이터는 굵게 표시됩니다.

내가 어떻게 할 수 있는지 아는 사람 있나요?
나는 그것을 사용할 수 있다는 것을 알고 있지만 , 및 플래그 와 함께 사용할 grep수는 없습니다 .grep-A-B-C

답변1

어때요?sedgotos(충격, 공포)가 포함된 스크립트입니다. 데이터를 더 정확하게 설명하면 단순화될 수 있습니다.

sed -n '
:start
  /Server .* Health Check/{
      n
      /Date - Count/n
   :loop1
      / : /{p; n; b loop1
      }
      b start
  }
  /Errors caused by/{
      n
   :loop2
      /Server/n
      /^[0-9]/{p; n; b loop2
      }
      b start
  }
'

스크립트는 제목의 첫 번째 스타일을 인식하고 {} 부분을 입력합니다. 다음 줄(n)을 읽거나 날짜 헤더인 경우 다른 줄을 읽습니다. 줄이 " : " 스타일 줄(/ : /)과 일치하면 {} 섹션이 입력되고, 줄이 인쇄되고(p), 다음 줄이 읽혀지고(n), Loop1 레이블로 분기됩니다(b). 더 이상 일치하는 줄이 없으면 레이블의 시작 부분으로 분기됩니다.

헤더의 두 번째 스타일을 볼 때도 같은 일이 발생합니다.

답변2

GNU 도구가 있다면 다음과 같이 할 수 있습니다:

for match in \
    Server\ Health\ Check\ 1
    Server\ Health\ Check\ 2
    Errors\ caused\ by\ X
do  grep -Fxm1 "$match"
    case $match in 
    (S*) sed -nEu '/^[0-9/:]+/!q;p';;
    (*)  sed -u '4q;3d;1d';;
esac;done <file

여기서 가정은 다음과 같습니다.일부관심 있는 섹션 사이에 데이터를 삽입하세요.(그렇지 않기 때문에 cat:).

GNU 도구 없이:

grep -nxE 'Server Health Check [12]|Errors caused by X' <file |
sed 's|\([^:]*\):S.*|\1,/\n.*[^0-9/:]/{\1!P?}?|
     s|\([^:]*\):E.*|\1{N;s/.*\\n//p;N;s///p?}?|
     y/?/\n/' | sed -e1!N -f- -eD ./file

답변3

가장 익숙한 언어에 따라 Perl, Python 또는 Ruby와 같은 전체 스크립팅 언어를 사용하십시오. 그렇지 않다면 Python을 배우는 것이 아마도 가장 큰 이점을 가져올 것입니다. 많은 Linux 배포판은 Python을 사용하여 성능에 중요하지 않은 시스템 도구 및 작업을 수행하며, 이를 읽는 방법을 알면 언젠가는 성과를 거둘 것입니다.

검색하고, 선을 분석하고, 정보를 파악하고, 유연하고 강력한 데이터 구조로 결과를 구성할 수 있으면 이 상황과 앞으로 발생할 많은 유사한 상황에서 작업을 절약할 수 있습니다.

관련 정보