약 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을 사용하여 성능에 중요하지 않은 시스템 도구 및 작업을 수행하며, 이를 읽는 방법을 알면 언젠가는 성과를 거둘 것입니다.
검색하고, 선을 분석하고, 정보를 파악하고, 유연하고 강력한 데이터 구조로 결과를 구성할 수 있으면 이 상황과 앞으로 발생할 많은 유사한 상황에서 작업을 절약할 수 있습니다.