두 태그 사이의 여러 줄 grep으로 마지막 일치 항목만 표시

두 태그 사이의 여러 줄 grep으로 마지막 일치 항목만 표시

데이터 세그먼트를 로그 출력에 혼합하는 프로그램이 있습니다.

log message
log message
----BEGIN INLINE DATA----
data
data
data
-----END INLINE DATA-----
log messge

비슷한 걸 찾고 있는데,

awk '/-BEGIN INLINE DATA-/,/-END INLINE DATA-/'

그러나 주변의 "레이블"이 아닌 마지막 데이터 세그먼트만 인쇄해야 합니다.

답변1

awk를 사용하여 시작 마커 이후에 데이터 축적을 시작하고 종료 마커를 만나면 중지합니다. 새로운 시작 마커가 나타나면 데이터 누산기를 다시 초기화하십시오.

awk '
    /-BEGIN INLINE DATA-/ {data = ""; storing = 1}
    /-END INLINE DATA-/ {storing = 0}
    storing {data = data "\n" $0}
    END {print data}
'

답변2

다음과 같이 두 개의 sed를 파이프할 수 있습니다.

<your program> | tac | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac

답변3

tac log.txt | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac

일을 끝낼 것 같아

답변4

Perl에서 이 작업을 수행하는 다소 특이한 방법은 다음과 같습니다.

perl -ne '
  BEGIN{ $/="----BEGIN INLINE DATA----\n" } # Set input record separator

  $payload= s/----END INLINE DATA----.*\z//rs; # Remove end marker and messages

  END{ print $payload } # Print the last payload

' file

이를 위해서는 Perl v5.14 이상이 필요합니다. 이전 버전의 Perl을 사용하려는 경우 추가 줄이 필요합니다.

perl -ne '
  BEGIN{ $/="----BEGIN INLINE DATA----\n" } # Set input record separator

  $payload= $_; # Copy current line into $payload
  $payload=~ s/----END INLINE DATA----.*\z//s; # Remove end marker and messages

  END{ print $payload } # Print the last payload

' file

관련 정보