리눅스 정규 표현식(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 대용)