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 bytes —Blog:라벨 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