마지막 패턴 발생에서 다른 패턴으로 Grep

마지막 패턴 발생에서 다른 패턴으로 Grep

좋은 아침이에요,

나는 여러 개의 반복 패턴이 있고 그 뒤에 내가 찾으려는 패턴이 있는 파일에 대한 UNIX 스크립트를 작성하려고 합니다. 이 질문은 다음과 매우 유사합니다.

"다른 패턴 이전에 마지막으로 나타나는 패턴을 가져옵니다.그러나 "tac"(또는 "tail -r")이 없고 String2와 String2 이전의 마지막 String1을 반환하려고 합니다.

산출:

...
Condition 1: A
foo
Condition 1: B
foo
Condition 2: C
foo
Condition 1: D
foo
Condition 1: E
foo
Condition 2: F
...

다음을 반환하는 grep/sed/awk 스크립트를 작성하고 싶습니다.

Condition 1: B
Condition 2: C
Condition 1: E
Condition 2: F

조건 1은 항상 조건 2 위의 "x" 행이므로 다음을 사용해 보았습니다.

grep -B x "Condition 2"

거기에서 어떤 이유로 결과 스크립트 출력의 두 번째 발생이 맨 위에서 몇 줄에서 중지되므로(따라서 조건 1은 표시되지 않음) 조건 1/2 이유 사이에 빈 줄이 있을 수 있으므로 확실하지 않습니다. 그래서 grep -B 사용을 포기했습니다. 나는 "뒤로" grep할 수 있기 때문에 tac이 도움이 될 것이라고 생각했지만 내 환경에는 tac 명령(또는 tail -r)이 없습니다.

누구든지 제안 사항이 있으면 크게 감사하겠습니다. 시간을 내주셔서 미리 감사드립니다.

답변1

글쎄요, grep작동하지 않는다면 awk작동할지 확실하지 않지만 다음을 시도해 볼 수 있습니다.

awk '/Condition 1/ { acc = $0; } /Condition 2/ { print acc; print; }' input

답변2

대체 조건을 기반으로 보다 일반적으로 사용됩니다(항상 루프 2-1에 있는 것은 아님). 마지막 조건을 기억하고 변경되었는지 비교하고, 변경된 경우 기억하지 못하는 경우 마지막 조건 줄을 인쇄합니다. 또한 종료 시 마지막 기억을 인쇄하고 첫 번째 조건이 발생할 때 기억 루프를 시작합니다.

awk -F '[[:blank:]:]*'
   /^Condition/ { 

      if (Index == $2) Last = $0
       else if (Index ~ /^$/) Index = $2; Last = $0
             elseprint Last
      Index = $2
      }
   END { print Last }
   ' YourFile

관련 정보