
콘텐츠가 비어 있지 않고 문제가 있는 경우에만 일치하는 2개의 패턴 사이에서 데이터를 추출하려고 합니다.
예는 다음과 같습니다.
==============================
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
나는 text 일치 전후에 줄을 추출하고 일치하는 패턴 사이의 모든 것을 추출하는 것을 알고 있지만 데이터가 비어 있지 않은 경우에만 일치하는 패턴 사이의 모든 것을 인쇄하는 방법을 알고 싶습니다.
내가 시도했지만 작동하지 않은 것은 다음과 같습니다.
grep -zPo '(?s)Queue(?:.(?!</Queue))*?\Current*?</Queue'
원본 텍스트 파일은 다른 스크립트에 의해 생성됩니다.
일치하는 패턴 'Queue' 사이에 데이터 라인이 3개 이상 있을 수 있습니다.
답변1
이렇게 시도해 볼 수도 있습니다
sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile
이것은 line이 일치할 때 다음 세 줄을 가져옵니다 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개 이상의 등호로 설정합니다. 두 번째 규칙은 "헤더", 즉 "Queue Manager" 문자열을 포함하는 레코드를 추적합니다. 세 번째 규칙은 레코드에 소문자가 하나 이상 포함된 경우, 즉 비어 있지 않은 경우 헤더와 현재 레코드를 인쇄합니다.