일치하는 두 패턴 사이에서 데이터를 추출하려고 하는데 콘텐츠가 비어 있지 않고 이 작업을 수행하는 데 문제가 있는 경우에만 가능합니다.
예는 다음과 같습니다.
==============================
Queue Manager is : MQ73PCRTB2
==============================
==============================
Queue Manager is : MQ73PCSH01
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSH02
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSHA1
==============================
==============================
Queue Manager is : MQ73PCSHA2
==============================
내가 출력에서 보고 싶은 것은 다음과 같습니다.
==============================
Queue Manager is : MQ73PCSH01
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
==============================
Queue Manager is : MQ73PCSH02
==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100
일치하는 텍스트 앞뒤의 줄을 추출하고 일치하는 패턴 사이의 모든 것을 추출하고 싶지만 데이터가 비어 있지 않은 경우에만 일치하는 패턴 사이의 모든 것을 인쇄하는 방법을 알고 싶습니다.
내가 성공하지 못한 채 시도한 것은 다음과 같습니다.
grep -zPo '(?s)Queue(?:.(?!</Queue))*?\Current*?</Queue'
원본 텍스트 파일은 다른 스크립트에 의해 생성되었습니다.
일치하는 패턴 "Queue" 사이에 3개 이상의 데이터 행이 있을 수 있습니다.
답변1
이것을 시도해 볼 수 있습니다
sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile
줄이 일치하면 다음 세 줄만 가져옵니다 Queue
. 패턴 공간이 구분 기호 1 로 끝나면 제거됩니다(또는 2 로 가져온 첫 번째 또는 두 번째 줄 이 입력의 마지막 줄인 경우).
다른 줄이 =
연속 기호로 끝날 수 있는 경우 정규식에서 ==$
구분 기호와 정확히 일치하는 항목으로 바꿔야 합니다.=\{37\}$
1: 구분 기호가 줄 일치라고 가정합니다 ^[[:blank:]]*==*$
(따라서 후행 공백이 없음).
2: 파일의 내용은 스크립트에 의해 생성되므로 파일은 항상 빈 줄로 끝나야 합니다. 따라서 sed는 가져온 두 번째 줄이 파일의 마지막 줄인지만 확인해야 합니다(마지막 블록이 다음인지 감지하기 위해). 비어 있음) 그러나 귀하의 예에서는 후행 줄이 누락되었으므로누구나...
답변2
BEGIN { RS="=====*\n" }
/Queue Manager/ {
manager = $0; next;
}
/[a-z]/ {
print RT manager RT $0;
}
첫 번째 규칙은 레코드 구분 기호를 4개 이상의 등호로 설정합니다. 두 번째 규칙은 "큐 관리자" 문자열을 포함하는 레코드인 "헤더"를 추적합니다. 세 번째 규칙은 레코드에 하나 이상의 소문자, 즉 비어 있지 않은 경우 제목과 현재 레코드를 인쇄합니다.