기본 문법
grep [옵션] 패턴 [파일...]
grep은 파일이나 표준 입력에서 지정한 패턴(문자열 또는 정규표현식)이 포함된 줄을 찾아 출력하는 명령어입니다. 이름은 'global regular expression print'에서 왔으며, 리눅스의 기본 텍스트 검색 도구입니다. 기본 동작은 일치하는 줄 전체를 그대로 출력하는 것이고, 옵션을 붙이면 줄 번호 표시, 대소문자 무시, 일치한 부분만 추출, 건수만 세기 등으로 동작을 바꿀 수 있습니다.
실무에서는 로그 분석에 자주 쓰입니다. 애플리케이션 로그에서 ERROR나 WARN이 들어간 줄만 뽑아 별도 파일로 저장하거나, 인증 로그에서 실패 기록만 골라내는 작업이 대표적입니다. 원본의 줄 순서를 그대로 유지하기 때문에 시간순 로그를 분석할 때 유리하며, sort·uniq·cut·awk 등과 파이프로 연결해 통계를 만들 수도 있습니다.
기본 검색은 부분 문자열 일치입니다. 즉 패턴이 단어 중간에 들어 있어도 일치로 처리되므로, 단어 단위로만 찾으려면 -w를 사용해야 합니다. 리눅스마스터·LPIC·RHCSA 같은 시험에서도 정규표현식과 함께 출제되며, 특정 문자열이 포함된 줄을 검색해 리다이렉션으로 파일에 저장하거나, -c로 건수를 세고 -o로 원하는 부분만 뽑아내는 유형이 반복해서 등장합니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-i | 대소문자를 구분하지 않고 검색 | grep -i error app.log |
-v | 패턴과 일치하지 않는 줄만 출력 | grep -v '^#' /tmp/demo/conf.txt |
-n | 일치한 줄의 줄 번호를 함께 출력 | grep -n WARN app.log |
-c | 일치한 줄의 개수만 출력(일치 횟수가 아니라 줄 수) | grep -c ERROR app.log |
-r | 디렉터리를 재귀적으로 검색(심볼릭 링크는 따라가지 않음) | grep -r TODO /tmp/demo |
-o | 일치한 줄 전체가 아니라 일치한 부분만 출력 | grep -o 'user=[a-z]*' auth.log |
-E | 확장 정규표현식(ERE) 사용 | grep -E 'ERROR|WARN' app.log |
-l | 일치하는 내용이 있는 파일 이름만 출력 | grep -rl ERROR /tmp/demo |
-w | 단어 단위로 정확히 일치하는 경우만 검색 | grep -w root /tmp/demo/passwd |
-F | 패턴을 정규표현식이 아닌 고정 문자열로 처리 | grep -F '192.168.0.1' access.log |
실무 예시
파일에서 문자열이 포함된 줄 찾기
준비: mkdir -p /tmp/demo; printf 'ich bin hier\nhello world\nnicht gut\n' > /tmp/demo/input_text.txt
$ grep ich /tmp/demo/input_text.txt
ich bin hier
nicht gut
지정한 문자열이 들어 있는 줄을 원본 순서대로 출력합니다. 기본 동작은 부분 문자열 일치이므로 'nicht gut' 줄도 단어 중간에 ich를 포함해 함께 출력됩니다. 단어 단위로만 찾으려면 grep -w ich 를 사용합니다.
검색 결과를 파일로 저장하기
준비: mkdir -p /tmp/demo; printf '2024-01-01 INFO start\n2024-01-01 ERROR disk full\n2024-01-01 WARN slow\n2024-01-01 ERROR timeout\n' > /tmp/demo/app.log
$ grep ERROR /tmp/demo/app.log > /tmp/demo/error_only.log; cat /tmp/demo/error_only.log
2024-01-01 ERROR disk full
2024-01-01 ERROR timeout
리다이렉션(>)으로 검색 결과를 파일에 덮어쓰기 저장합니다. 원본 로그의 줄 순서가 그대로 유지됩니다. 기존 파일이 있으면 내용이 지워지므로 저장 경로를 확인하고 실행하세요.
일치한 줄 수 세기
준비: mkdir -p /tmp/demo; printf 'INFO a\nWARN b\nWARN c\nERROR d\nWARN e\n' > /tmp/demo/count.log
$ grep -c WARN /tmp/demo/count.log
3
-c는 일치한 줄의 개수만 숫자로 출력합니다. COUNT=3 같은 형식이 필요하면 echo "COUNT=$(grep -c WARN /tmp/demo/count.log)" 로 조합합니다.
대소문자 무시하고 줄 번호와 함께 보기
준비: mkdir -p /tmp/demo; printf 'system Error occurred\nall fine\nFATAL ERROR\n' > /tmp/demo/mixed.log
$ grep -in error /tmp/demo/mixed.log
1:system Error occurred
3:FATAL ERROR
-i로 대소문자를 무시하고, -n으로 몇 번째 줄인지 확인할 수 있습니다. 여러 옵션은 -in처럼 묶어 쓸 수 있습니다.
일치 부분만 추출해 정렬·중복 제거하기
준비: mkdir -p /tmp/demo; printf 'FAILED login user=tom\nOK login user=amy\nFAILED login user=bob\nFAILED login user=tom\n' > /tmp/demo/auth.log
$ grep FAILED /tmp/demo/auth.log | grep -o 'user=[a-z]*' | cut -d= -f2 | sort -u
bob
tom
먼저 FAILED 줄만 고른 뒤 -o로 user=이름 부분만 뽑고, cut과 sort -u로 사용자 이름을 정렬하고 중복을 제거합니다. sort -u 결과는 알파벳 순이므로 원본 순서와 다를 수 있습니다.
주의할 점
- 패턴에 공백이나 *, ?, | 같은 문자가 있으면 작은따옴표로 감싸야 셸이 먼저 해석하지 않습니다.
- 기본 검색은 부분 문자열 일치입니다. 단어 단위 검색이 필요하면 -w를 사용하세요.
- > 는 덮어쓰기, >> 는 이어쓰기입니다. 실습에서 결과가 누적되거나 사라지면 리다이렉션 기호를 확인하세요.
- 일치하는 줄이 없으면 아무것도 출력하지 않고 종료 코드 1을 반환합니다. 오류가 아닙니다(오류는 종료 코드 2).
- -o는 한 줄에 여러 번 일치하면 일치한 횟수만큼 출력하므로, -c로 센 줄 수와 출력 줄 수가 다를 수 있습니다.
- /var/log 아래 로그는 일반 사용자 권한으로 읽지 못할 수 있습니다. 이때 파일 권한을 넓히지 말고 sudo로 읽으세요.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
