Linux Bash shell script

Bash Shell Script - 정규표현식과 grep

임베디드 친구 2025. 2. 5. 11:02
728x90
반응형

Linux Bash 스크립트에서 강력한 텍스트 검색 및 처리 도구로 grep을 빼놓을 수 없습니다. 이 글에서는 정규표현식(Regular Expression)과 함께 grep을 활용하는 방법을 자세히 다룹니다. 정규표현식은 패턴 매칭을 위한 강력한 도구이며, grep은 파일 또는 문자열에서 이러한 패턴을 찾아주는 명령어입니다.


1. 정규표현식이란?

정규표현식은 텍스트에서 특정 패턴을 매칭하는 데 사용됩니다. 다음은 정규표현식의 기본 구성 요소입니다:

1.1. 기초 패턴

패턴 설명
. 임의의 한 문자
^ 문자열의 시작
$ 문자열의 끝
* 앞 문자가 0번 이상 반복
+ 앞 문자가 1번 이상 반복
? 앞 문자가 0번 또는 1번 등장
[ ] 문자 클래스
` `
() 그룹화

1.2. 예제

  • ^Hello: 문자열이 Hello로 시작하는 경우
  • world$: 문자열이 world로 끝나는 경우
  • h.t: ht 사이에 어떤 문자든 하나 존재하는 경우
  • [abc]: a, b, 또는 c 중 하나가 매칭되는 경우
  • \d: 숫자 (0-9)에 매칭

2. grep 소개

grepGlobal Regular Expression Print의 약자로, 파일 또는 입력된 문자열에서 패턴을 검색하는 데 사용됩니다. 기본 사용법은 다음과 같습니다:

grep [옵션] "패턴" [파일명]

2.1. 주요 옵션

옵션 설명
-i 대소문자 구분 없이 검색
-v 패턴과 일치하지 않는 행 출력
-c 매칭된 행의 개수 출력
-n 매칭된 행의 줄 번호 출력
-r 디렉토리 내 모든 파일을 재귀적으로 검색
-E 확장 정규표현식(Extended Regex) 사용
-o 매칭된 패턴만 출력

3. 실습: 정규표현식과 grep 사용 예제

3.1. 간단한 문자열 검색

# sample.txt 내용:
# Hello World
# This is a test file.
# Regex is powerful.

# "test"라는 단어가 포함된 줄을 검색
grep "test" sample.txt

출력:

This is a test file.

3.2. 대소문자 구분 없이 검색

# "hello"를 대소문자 구분 없이 검색
grep -i "hello" sample.txt

출력:

Hello World

3.3. 숫자가 포함된 줄 찾기

# 숫자가 포함된 줄 검색
grep "[0-9]" sample.txt

3.4. 정규표현식 확장: 이메일 주소 검색

# 파일 내 이메일 주소 검색
# emails.txt 내용:
# user1@example.com
# contact@domain.org
# invalid-email@domain

grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" emails.txt

출력:

user1@example.com
contact@domain.org

3.5. 특정 단어가 없는 줄 찾기

# "powerful"이 포함되지 않은 줄 검색
grep -v "powerful" sample.txt

3.6. 재귀적으로 파일 검색

# 현재 디렉토리와 하위 디렉토리에서 "error" 검색
grep -r "error" .

4. 고급 사용법: Bash 스크립트에서 활용하기

4.1. 로그 파일에서 특정 패턴 필터링

#!/bin/bash

# 로그 파일에서 "ERROR"로 시작하는 행 추출
grep "^ERROR" /var/log/syslog > error_logs.txt

echo "추출된 오류 로그는 error_logs.txt에 저장되었습니다."

4.2. 사용자 입력으로 검색

#!/bin/bash

read -p "검색할 패턴을 입력하세요: " pattern
read -p "검색할 파일명을 입력하세요: " filename

grep "$pattern" "$filename"

4.3. 정규표현식으로 텍스트 파일 처리

#!/bin/bash

# 전화번호 형식 검사
while read -r line; do
  if [[ $line =~ ^[0-9]{3}-[0-9]{3}-[0-9]{4}$ ]]; then
    echo "유효한 전화번호: $line"
  else
    echo "잘못된 형식: $line"
  fi
done < phone_numbers.txt

5. 마무리

정규표현식과 grep은 텍스트 데이터 처리에서 필수적인 도구입니다. 이 글에서 다룬 기본 문법과 명령어를 익힌 후, 실습을 통해 더 복잡한 정규표현식과 사용 사례에 도전해 보세요. grep을 활용한 효율적인 데이터 검색은 Linux 환경에서 작업 생산성을 크게 향상시킬 것입니다.

반응형