리눅스 정규 표현식(Regular Expression) 정리
정규 표현식(정규식)은 문자열에서 특정 패턴을 찾거나 치환할 때 사용하는 표현 방법입니다. 리눅스에서는 grep, sed, awk, vi 등 대부분의 텍스트 처리 도구에서 정규식을 지원합니다.
1. 정규식의 종류
리눅스 정규식은 크게 세 가지로 구분됩니다.
| 종류 | 설명 | 대표 도구 |
|---|---|---|
| BRE (Basic Regular Expression) | 기본 정규식. ( ) { } + ? 등은 백슬래시(\)를 붙여야 특수문자로 동작 |
grep, sed (기본) |
| ERE (Extended Regular Expression) | 확장 정규식. 백슬래시 없이 ( ) { } + ? 바로 사용 가능 |
grep -E, egrep, awk |
| PCRE (Perl Compatible Regular Expression) | Perl 호환 정규식. 가장 강력하고 기능이 많음 (\d, \w, 전방탐색 등) |
grep -P, perl |
plaintext
grep 'pattern' file # BRE
grep -E 'pattern' file # ERE (= egrep)
grep -P 'pattern' file # PCRE
2. 기본 메타문자 (BRE / ERE 공통)
| 메타문자 | 의미 | 예시 | 매치 |
|---|---|---|---|
. |
임의의 문자 1개 | a.c |
abc, a1c, a c |
* |
바로 앞 문자가 0회 이상 반복 | ab*c |
ac, abc, abbc |
^ |
줄의 시작 | ^abc |
abc로 시작하는 줄 |
$ |
줄의 끝 | abc$ |
abc로 끝나는 줄 |
[ ] |
대괄호 안의 문자 중 하나 | [abc] |
a 또는 b 또는 c |
[^ ] |
대괄호 안의 문자를 제외한 문자 | [^abc] |
a, b, c가 아닌 문자 |
[a-z] |
범위 지정 | [0-9] |
숫자 하나 |
\ |
메타문자를 일반 문자로 처리(이스케이프) | a\.c |
a.c (점 자체) |
3. 확장 메타문자 (ERE, 또는 BRE에서 \ 필요)
| 메타문자 | 의미 | BRE 표기 | ERE 표기 |
|---|---|---|---|
+ |
앞 문자가 1회 이상 반복 | a\+ |
a+ |
? |
앞 문자가 0회 또는 1회 | a\? |
a? |
\| |
OR (둘 중 하나) | a\|b (X, \|도 이스케이프 필요) |
a\|b |
( ) |
그룹핑 | \(ab\)\+ |
(ab)+ |
{n,m} |
n회 이상 m회 이하 반복 | a\{2,4\} |
a{2,4} |
4. PCRE 전용 표현 (grep -P, Perl 등)
| 표현 | 의미 |
|---|---|
\d |
숫자 [0-9] |
\D |
숫자가 아닌 문자 |
\w |
단어 문자 [A-Za-z0-9_] |
\W |
단어 문자가 아닌 문자 |
\s |
공백 문자(스페이스, 탭, 줄바꿈 등) |
\S |
공백이 아닌 문자 |
\b |
단어 경계 |
(?=...) |
전방탐색(lookahead) |
(?!...) |
부정형 전방탐색 |
5. 자주 쓰는 문자 클래스 (POSIX)
| 클래스 | 의미 |
|---|---|
[[:digit:]] |
숫자 (0-9) |
[[:alpha:]] |
알파벳 |
[[:alnum:]] |
알파벳 + 숫자 |
[[:upper:]] |
대문자 |
[[:lower:]] |
소문자 |
[[:space:]] |
공백류 |
[[:punct:]] |
특수문자(구두점) |
plaintext
grep '[[:digit:]]' file.txt # 숫자가 포함된 줄 찾기
6. grep 실전 예시
plaintext
# 1. 특정 단어가 포함된 줄 찾기
grep 'error' /var/log/syslog
# 2. 대소문자 구분 없이 찾기
grep -i 'error' /var/log/syslog
# 3. 특정 단어로 시작하는 줄
grep '^root' /etc/passwd
# 4. 특정 단어로 끝나는 줄
grep 'bash$' /etc/passwd
# 5. 빈 줄 찾기
grep '^$' file.txt
# 6. 빈 줄이 아닌 줄만 출력
grep -v '^$' file.txt
# 7. 숫자로만 이루어진 줄 찾기
grep -E '^[0-9]+$' file.txt
# 8. IP 주소 형태 찾기 (간단 버전)
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
# 9. 이메일 형태 찾기
grep -E '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' file.txt
# 10. 여러 단어 중 하나라도 포함된 줄 (OR)
grep -E 'error|fail|warn' /var/log/syslog
# 11. 특정 확장자 파일명 찾기
ls | grep -E '\.(jpg|png|gif)$'
# 12. 줄 번호와 함께 출력
grep -n 'error' file.txt
# 13. 매치된 개수만 세기
grep -c 'error' file.txt
# 14. 매치되지 않는 줄만 출력
grep -v 'error' file.txt
# 15. 여러 파일에서 검색 (파일명 함께 출력)
grep -r 'TODO' ./src/
7. sed 실전 예시 (치환/삭제)
plaintext
# 1. 특정 문자열을 다른 문자열로 치환 (첫 번째만)
sed 's/foo/bar/' file.txt
# 2. 줄 전체에서 모든 매치 치환
sed 's/foo/bar/g' file.txt
# 3. 파일을 직접 수정 (원본 백업 생성)
sed -i.bak 's/foo/bar/g' file.txt
# 4. 특정 줄 범위에서만 치환 (1~10번째 줄)
sed '1,10s/foo/bar/g' file.txt
# 5. 특정 패턴이 있는 줄 삭제
sed '/^#/d' file.txt # 주석(#으로 시작하는 줄) 삭제
# 6. 빈 줄 삭제
sed '/^$/d' file.txt
# 7. 특정 줄 번호 삭제
sed '3d' file.txt # 3번째 줄 삭제
sed '3,5d' file.txt # 3~5번째 줄 삭제
# 8. 대소문자 구분 없이 치환
sed 's/error/ERROR/gi' file.txt
# 9. 정규식 그룹을 이용한 치환 (날짜 형식 변경: YYYY-MM-DD → DD/MM/YYYY)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' file.txt
# 10. 특정 문자열이 포함된 줄만 출력 (grep처럼 사용)
sed -n '/error/p' file.txt
8. awk 실전 예시
plaintext
# 1. 특정 패턴이 포함된 줄 출력
awk '/error/' file.txt
# 2. 정규식으로 특정 필드 조건 검사
awk '$1 ~ /^root/' /etc/passwd
# 3. 필드 구분자 지정 후 정규식 매치
awk -F: '$1 ~ /^root/ {print $1, $3}' /etc/passwd
9. 자주 쓰는 정규식 패턴 모음
| 목적 | 패턴 (ERE 기준) |
|---|---|
| 숫자만 | ^[0-9]+$ |
| 영문자만 | ^[A-Za-z]+$ |
| 영문+숫자만 | ^[A-Za-z0-9]+$ |
| 공백 제거 확인(앞뒤 공백 없는 줄) | ^[^ ].*[^ ]$ |
| 전화번호(010-1234-5678) | ^01[0-9]-[0-9]{3,4}-[0-9]{4}$ |
| 이메일 | ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ |
| IPv4 주소(간단) | ^([0-9]{1,3}\.){3}[0-9]{1,3}$ |
| 날짜(YYYY-MM-DD) | ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ |
| URL(http/https) | ^https?://[A-Za-z0-9.-]+(/[^ ]*)?$ |
| 주석 줄(#으로 시작) | ^# |
| 빈 줄 | ^$ |
| 여러 개의 공백을 하나로 | sed -E 's/ +/ /g' |
10. BRE와 ERE 비교 정리
| 목적 | BRE (grep, sed 기본) | ERE (grep -E, egrep) |
|---|---|---|
| 그룹핑 | \( \) |
( ) |
| 반복(1회 이상) | \+ |
+ |
| 선택(0 또는 1회) | \? |
? |
| OR | \| (GNU 확장) |
\| |
| 반복 횟수 지정 | \{n,m\} |
{n,m} |
팁: 헷갈릴 때는 grep -E(또는 egrep)를 사용하면 백슬래시 없이 직관적으로 작성할 수 있습니다.
11. 주의할 점
*는 정규식에서 "0회 이상 반복"이지 셸 와일드카드의 "임의의 문자열"이 아닙니다. (*.txt는 셸 문법이지 정규식이 아님).은 정규식에서 임의의 한 문자이므로, 실제 점(.)을 찾으려면\.로 이스케이프해야 합니다.grep은 기본적으로 줄 단위로 매치합니다. 여러 줄에 걸친 패턴은grep -Pzo또는awk,perl을 활용해야 합니다.- 정규식은 도구(grep/sed/awk/vi)마다 지원 범위가 조금씩 다르므로, 헷갈리면
-E(확장 정규식) 옵션 사용을 우선 고려하세요.
12. 명령어별 빠른 참고
plaintext
grep -E 'pattern' file # 확장 정규식으로 검색
grep -P 'pattern' file # PCRE로 검색 (\d, \w 등 사용 가능)
sed -E 's/pattern/repl/g' file # 확장 정규식으로 치환
sed -n '/pattern/p' file # 패턴이 있는 줄만 출력 (grep 대용)