본문 바로가기
C.W.K.
Stream
Lesson 02 of 10 · published

grep 심화

~15 min · grep, regex, search

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

줄 가운데 패턴과 맞는 항목을 찾아

grep은 파일이나 stdin을 읽어 정규식과 일치하는 줄을 출력해. 기본 문법은 BRE이고 -E는 ERE, 구현이 지원하는 -P는 PCRE 계열을 선택해. 셸 글로브와 정규식은 서로 다른 언어이므로 패턴을 따옴표로 감싸 셸이 먼저 확장하지 않게 해. 찾고 싶은 것이 고정 문자열이면 -F를 사용하면 정규식 메타 문자를 피할 수 있어.

자주 쓰는 플래그를 목적별로 묶어

  • -i: 대소문자를 구분하지 않아.
  • -r 또는 -R: 디렉터리를 재귀 검색해. 심볼릭 링크 처리 차이를 확인해.
  • -n: 줄 번호를 붙여.
  • -v: 일치하지 않는 줄을 골라.
  • -l: 일치 항목이 있는 파일 이름만 보여 줘.
  • -c: 일치한 줄 수를 세어.
  • -A 3, -B 3, -C 3: 뒤·앞·양쪽 문맥을 보여 줘.
  • --include--exclude: 검색할 파일 집합을 제한해.

지원 옵션은 BSD grep과 GNU grep에서 다를 수 있으므로 현재 구현의 도움말을 확인해.

검색 범위를 먼저 줄여

grep -rni --include='*.py' 'todo' .
grep -rl --exclude-dir=node_modules 'DATABASE_URL' .
grep -nC 2 -E 'error|warning' app.log
grep -c '^GET ' access.log

저장소 전체를 무작정 검색하기보다 파일 확장자와 제외할 생성 디렉터리를 정하면 결과와 실행 시간이 모두 예측하기 쉬워. 바이너리 파일을 만날 수 있다면 해당 구현의 바이너리 처리 옵션도 확인해.

종료 상태는 세 가지 의미를 가질 수 있어

grep은 보통 일치 항목이 있으면 0, 없으면 1, 읽기나 사용법 오류가 나면 2를 반환해. 따라서 “찾지 못함”과 “검색 자체가 실패함”을 같은 분기로 다루면 안 돼. 스크립트에서 존재 여부를 검사할 때는 if grep -q pattern file; then ...처럼 명령을 조건으로 쓰고, 중요한 경우 1과 2를 구분해 처리해.

텍스트 줄 검색이 맞지 않는 문제도 있어

여러 줄 구조, JSON·YAML의 키 경로, 프로그래밍 언어의 심볼 관계는 줄 단위 정규식만으로 다루기 어려워. 저장소 검색에는 ripgrep, 구조화 데이터에는 jq나 yq, 코드 관계에는 언어 서버나 구문 분석 도구가 더 정확할 수 있어. grep이 빠르다는 이유로 입력 구조를 잃지 말고 문제에 맞는 경계를 선택해.

Code

실전 grep 레시피·bash
# Python 파일의 TODO를 줄 번호와 함께 찾기
grep -rn --include='*.py' 'TODO' .
# 오류 앞뒤 두 줄도 표시
grep -C 2 -i error build.log
# 스크립트에서 존재 여부만 검사
if grep -q '^export EDITOR=' ~/.zshrc; then
  echo 'EDITOR already set'
fi

External links

Exercise

시험 프로젝트에서 grep -rn TODO .로 TODO를 찾은 뒤 --include='*.py'--exclude-dir=node_modules를 더해 검색 범위를 줄여. grep -rn -C 2 'def main' .으로 주변 문맥도 보고, 존재 여부만 필요한 경우에는 종료 상태를 작은 스크립트에서 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.