grep과 정규표현식
쉽게 말하면
파일 내용 속에서 특정 글자가 들어간 줄만 골라 보여 주는 명령이에요. 긴 기록 파일에서 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 '^$' → 빈 줄 제외 |
시험에 이렇게 나와요
- grep -i(대소문자 무시), -v(반전), -n(줄 번호), -r(재귀), -c(개수), -E(확장 정규식)
- 정규식 ^ 시작, $ 끝, . 한 글자, * 반복
- 옵션 의미 (-v 반전, -c 개수, -l 파일명, -n 줄 번호)
- 정규식 ^ $ . * [ ] 해석
- egrep = grep -E, fgrep = grep -F
- 파이프와 함께: ps -ef | grep sshd
1차 출제기준 · 공개 기출 없음
확인 문제
Q1. grep -v INFO app.log의 결과는?
- INFO가 들어간 줄만
- INFO가 몇 줄인지 개수
- INFO가 없는 줄만
- INFO를 지운 파일
정답 보기
3번 INFO가 없는 줄만
-v(invert)는 조건을 뒤집어 일치하지 않는 줄을 보여 준다. 로그에서 정상 메시지(INFO)를 걸러 내고 문제만 볼 때 쓴다.
Q2. /etc/passwd에서 bash로 끝나는 줄을 찾는 명령은?
- grep *bash /etc/passwd
- grep bash$ /etc/passwd
- grep ^bash /etc/passwd
- grep -e bash /etc/passwd
정답 보기
2번 grep bash$ /etc/passwd
grep bash$ /etc/passwd다. 정규 표현식에서 $는 줄의 끝, ^는 줄의 처음을 뜻한다.
Q3. 패턴이 들어 있는 파일 이름만 출력하는 옵션은?
- -c
- -n
- -l
- -h
정답 보기
3번 -l
-l(list)이다. 일치하는 줄 대신 파일 이름만 보여 준다. -c는 일치한 줄 수, -n은 줄 번호를 보여 준다.
Q4. grep -E와 같은 명령은?
- pgrep
- rgrep
- fgrep
- egrep
정답 보기
4번 egrep
egrep. fgrep = grep -F, pgrep은 프로세스 검색.
헷갈리기 쉬운 O·X
grep은 파일 이름으로 파일을 찾는 명령이다.
정답 보기
X 파일 내용에서 줄을 찾는다. 이름은 find.
grep -w kim 은 kimchi가 들어간 줄에는 일치하지 않는다.
정답 보기
O 단어 단위 일치.
grep -c 는 일치하는 문자열의 총 개수를 센다.
정답 보기
X 일치하는 줄의 수를 센다.