공든탑앱 열기

grep과 정규표현식

리눅스마스터 2급 · 기본 명령어 · 약 12분

쉽게 말하면

파일 내용 속에서 특정 글자가 들어간 줄만 골라 보여 주는 명령이에요. 긴 기록 파일에서 ERROR가 들어간 줄만 찾을 때 써요. 파일 이름으로 찾는 find와 헷갈리지 마세요.

시험용 정의

grep은 파일이나 입력에서 패턴(정규표현식)과 일치하는 줄을 찾아 출력한다. 파일 이름으로 찾는 find와 달리, 파일 내용에서 줄을 찾는다.

비유로 이해하기

책에서 형광펜 칠한 줄만 골라 베껴 적는 것이다. -v는 반대로 칠하지 않은 줄만, -c는 몇 줄인지 세기만 한다.

자세히

정규표현식이란

정규표현식(regular expression)은 글자 그대로가 아니라 글자의 모양을 적는 패턴 언어다. "root"는 root라는 글자만 찾지만, ^[0-9]+$는 "숫자로만 이루어진 줄"처럼 규칙을 찾는다. ^, $, ., * 같은 특수 기호(메타문자)가 규칙을 만든다. grep·sed·awk·vi 검색이 모두 정규표현식을 쓴다. 기본 정규식(grep)은 + ? | ( )를 글자로 보고, 확장 정규식(grep -E, egrep)은 이들을 특수 기호로 쓴다.

셸의 와일드카드(*.txt)와 헷갈리지 말자. 셸에서 *는 "아무 글자 여러 개"지만, 정규식에서 *는 "앞 글자가 0번 이상"이다. 그래서 정규식의 "아무 글자 여러 개"는 .*이다.

정규표현식 기본

기호뜻예
^줄의 시작^root → root로 시작하는 줄
$줄의 끝bash$ → bash로 끝나는 줄
.아무 문자 한 개b.t → bat, bit
*앞 문자 0번 이상ab* → a, ab, abb
[abc]괄호 안 한 문자[Ee]rror
[^abc]괄호 안 문자 제외[^0-9]
+ ? |(확장) 1번 이상, 0~1번, 또는grep -E 'WARN|ERROR'
^$빈 줄grep -v '^$' → 빈 줄 제외

시험에 이렇게 나와요

1차 출제기준 · 공개 기출 없음

확인 문제

Q1. grep -v INFO app.log의 결과는?

  1. INFO가 들어간 줄만
  2. INFO가 몇 줄인지 개수
  3. INFO가 없는 줄만
  4. INFO를 지운 파일
정답 보기

3번 INFO가 없는 줄만

-v(invert)는 조건을 뒤집어 일치하지 않는 줄을 보여 준다. 로그에서 정상 메시지(INFO)를 걸러 내고 문제만 볼 때 쓴다.

Q2. /etc/passwd에서 bash로 끝나는 줄을 찾는 명령은?

  1. grep *bash /etc/passwd
  2. grep bash$ /etc/passwd
  3. grep ^bash /etc/passwd
  4. grep -e bash /etc/passwd
정답 보기

2번 grep bash$ /etc/passwd

grep bash$ /etc/passwd다. 정규 표현식에서 $는 줄의 끝, ^는 줄의 처음을 뜻한다.

Q3. 패턴이 들어 있는 파일 이름만 출력하는 옵션은?

  1. -c
  2. -n
  3. -l
  4. -h
정답 보기

3번 -l

-l(list)이다. 일치하는 줄 대신 파일 이름만 보여 준다. -c는 일치한 줄 수, -n은 줄 번호를 보여 준다.

Q4. grep -E와 같은 명령은?

  1. pgrep
  2. rgrep
  3. fgrep
  4. egrep
정답 보기

4번 egrep

egrep. fgrep = grep -F, pgrep은 프로세스 검색.

헷갈리기 쉬운 O·X

grep은 파일 이름으로 파일을 찾는 명령이다.

정답 보기

X 파일 내용에서 줄을 찾는다. 이름은 find.

grep -w kim 은 kimchi가 들어간 줄에는 일치하지 않는다.

정답 보기

O 단어 단위 일치.

grep -c 는 일치하는 문자열의 총 개수를 센다.

정답 보기

X 일치하는 줄의 수를 센다.

함께 보면 좋은 개념