grep, sed, awk, perl: 섹션 내의 ID를 기반으로 파일에서 섹션 가져오기

grep, sed, awk, perl: 섹션 내의 ID를 기반으로 파일에서 섹션 가져오기

다음 형식의 파일이 있다고 가정해 보겠습니다.

(lots of sections...)

SECTION foo
    keyA=valA
    ...
ENDSECTION

(lots of sections...)

sed를 사용하여 해당 부분을 추출할 수 있습니다 sed -nE /^SECTION foo$/,/^ENDSECTION$/p. 내 문제는 형식이 다음과 같이 변경될 때 발생합니다.

(lots of sections...)

SECTION
    keyA=valA
    id=foo
    ...
ENDSECTION

(lots of sections...)

일반적인 도구(grep, sed, awk, perl, bash)를 사용하여 이 부분을 얻을 수 있는 방법이 있습니까?

답변1

이는 문서의 형식이 얼마나 "잘 구성되어 있는지"에 따라 다소 달라집니다. 각각 SECTION에 대해 일치하는 항목이 있다고 확신한다면 ENDSECTION아래 코드가 awk작동할 것입니다. 단, "한 줄짜리"라고 부르지는 않겠습니다(처음부터 이것이 가능한지 확신할 수 없습니다).

awk -v pat='id=foo' '/^SECTION/{n=f=0; delete buf;} \
 {buf[++n]=$0; if (index($0,pat)) f=1} \
 /^ENDSECTION/ {if (f) for (i=1;i<=n;i++) print buf[i]}' input.txt
  • 검색 패턴은 사용자가 지정하는 대로 적용됩니다 pat(그러나 현재 형식에서는 정규식 기반 검색이 아닌 고정 문자열 검색만 수행합니다).
  • SECTION(또는 키워드)로 시작하는 줄이 발견되면 플래그 f("발견"을 의미)와 줄 카운터가 n0으로 초기화됩니다. 또한 섹션이 완료될 때까지 인쇄 여부를 결정할 수 없기 때문에 섹션 전체를 버퍼링해야 하므로 버퍼 변수를 지웁니다 buf.
  • 모든 행(이 예에서는 빈 행 포함)에 대해 행 카운터가 n증가하고 해당 행이 배열 변수에 추가됩니다 buf. 이 플래그는 라인에서 패턴이 발견되면 f설정됩니다 1.
  • ENDSECTION키워드가 줄의 시작 부분에 있고 플래그가 이면 f버퍼 1를 한 줄씩 인쇄하여 해당 부분을 출력합니다.

모든 부분이 빈 줄로 구분되어 있는지 확인할 수 있다면,이 답변적은 코드로 이 작업을 수행하는 방법에 대한 올바른 방향을 알려줄 수 있지만 이것이 보장되지 않으면 "단락 모드" 접근 방식이 awk작동하지 않습니다.

또한 이 제안은 작업을 수행하는 데 필요한 최소한의 사항입니다. 빈 줄을 건너뛰거나 다른 온전성 검사 요구 사항을 충족하려는 경우 코드가 상당히 길어질 수 있습니다.

관련 정보