Linux
Bell  

grep이 놓친 멀티라인 레코드 — awk paragraph mode로 해결한 파이프라인 버그

📌 핵심 요약

자동화 파이프라인에서 grep으로 멀티라인 레코드를 필터링하면 매칭된 줄만 추출되어 나머지 필드(제목, URL)가 유실된다. awk의 paragraph mode(RS="")를 사용하면 빈 줄로 구분된 레코드 블록 전체를 하나의 단위로 다룰 수 있어 문제가 해결된다.


증상: 뭔가 잘리고 있다

자동화 파이프라인이 돌아가고 있었다. RSS 피드를 수집하고, 관심 있는 블로그 출처의 기사를 골라내고(curate.sh), 결과를 curated.md에 저장하는 구조였다.

그런데 어느 날부터 curated.md가 이상했다.

Blog: 보안뉴스
Blog: 보안뉴스
Blog: 보안뉴스

기사 제목도 없고, URL도 없다. 출처 라벨만 덩그러니 찍혀 있었다. 파이프라인은 에러 없이 정상 종료되고, 수집 데이터(raw)는 정상이었다. 어딘가에서 데이터가 사라지고 있었다.

파이프라인 구조 파악

collect.sh가 각 RSS 항목을 아래 형식으로 저장한다.

Title: TP-Link, 미국 텍사스주 소송 당해
URL: https://...
Date: 2026-02-19
Blog: 보안뉴스

Title: Microsoft Copilot, 기밀 이메일 접근 오류
URL: https://...
Date: 2026-02-19
Blog: 보안뉴스

빈 줄로 레코드를 구분하는 멀티라인 형식이다.

curate.sh는 여기서 관심 출처(보안뉴스, GeekNews 등)의 기사만 골라낸다.

원인: grep은 라인을 본다, 레코드를 모른다

문제가 된 코드:

pat="보안뉴스|GeekNews|The New Stack"
grep -E "Blog:.*($pat)" collected.txt >> curated.md

grep라인(line) 단위로 동작한다. Blog: 보안뉴스가 있는 줄에 매칭되면 그 줄 하나만 추출한다. 위아래 줄(Title:, URL:)은 그냥 흘러간다.

파일 크기로 보면 명확했다:

  • 수정 전 curated.md: 114 bytesBlog: 라벨 3개뿐
  • 수정 후 curated.md: 321 bytes — 제목 + URL 포함

grep이 나쁜 게 아니다. 라인 단위 도구인데 레코드 단위 작업에 쓴 것이 문제였다.

해결: awk paragraph mode

awk에는 paragraph mode가 있다. RS=""(Record Separator를 빈 문자열로 설정)로 활성화하면, 빈 줄로 구분된 블록 전체를 하나의 레코드로 다룬다.

pat="보안뉴스|GeekNews|The New Stack"

awk -v pat="$pat" '
  BEGIN { RS=""; ORS="\n\n" }
  $0 ~ "Blog:.*(" pat ")"
' collected.txt >> curated.md
  • RS="" → 빈 줄 = 레코드 구분자 (paragraph mode)
  • ORS="\n\n" → 출력 시 레코드 사이에 빈 줄 유지
  • $0 ~ "패턴" → 레코드 전체($0)에서 패턴 검색 → 매칭되면 레코드 전체 출력

Blog: 보안뉴스가 포함된 블록 전체(Title:, URL:, Date: 포함)가 정상 추출된다.

검증

파이프라인 다음 실행 후:

$ wc -c curated.md
321 curated.md

$ cat curated.md
Title: TP-Link, 미국 텍사스주 소송 당해
URL: https://...
Date: 2026-02-19
Blog: 보안뉴스

Title: Microsoft Copilot, 기밀 이메일 접근 오류
URL: https://...
Date: 2026-02-19
Blog: 보안뉴스

제목과 URL이 온전히 포함되어 있다.

정리: grep vs awk, 언제 뭘 쓸까

상황 도구
특정 패턴이 포함된 줄 추출 grep
패턴이 포함된 레코드(블록) 전체 추출 awk (paragraph mode)
CSV, TSV 등 필드 기반 처리 awk
복잡한 조건·변수·집계 awk

grep은 빠르고 직관적이지만 "한 줄"을 기본 단위로 본다. 멀티라인 레코드가 섞인 텍스트를 다룰 때는 처음부터 awk를 쓰는 게 낫다.

마치며

셸 스크립트에서 데이터가 "사라지는" 버그는 대부분 도구의 처리 단위와 데이터의 논리 단위가 불일치할 때 발생한다. grep은 라인을 보고, awk는 레코드를 본다. 도구를 고를 때 "내 데이터의 단위가 무엇인가"를 먼저 생각하면 이런 함정을 피할 수 있다.

참고 자료

조회수: 27

댓글 남기기