리눅스 정규 표현식(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
grep    'pattern'  file   # BRE
grep -E 'pattern'  file   # ERE (= egrep)
grep -P 'pattern'  file   # PCRE

2. 기본 메타문자 (BRE / ERE 공통)

메타문자의미예시매치
.임의의 문자 1개a.cabc, a1c, a c
*바로 앞 문자가 0회 이상 반복ab*cac, abc, abbc
^줄의 시작^abcabc로 시작하는 줄
$줄의 끝abc$abc로 끝나는 줄
[ ]대괄호 안의 문자 중 하나[abc]a 또는 b 또는 c
[^ ]대괄호 안의 문자를 제외한 문자[^abc]a, b, c가 아닌 문자
[a-z]범위 지정[0-9]숫자 하나
\메타문자를 일반 문자로 처리(이스케이프)a\.ca.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:]]특수문자(구두점)
grep '[[:digit:]]' file.txt    # 숫자가 포함된 줄 찾기

6. grep 실전 예시

# 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 실전 예시 (치환/삭제)

# 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 실전 예시

# 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. 명령어별 빠른 참고

grep -E 'pattern' file      # 확장 정규식으로 검색
grep -P 'pattern' file      # PCRE로 검색 (\d, \w 등 사용 가능)
sed -E 's/pattern/repl/g' file   # 확장 정규식으로 치환
sed -n '/pattern/p' file    # 패턴이 있는 줄만 출력 (grep 대용)

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤