개요
egrep은 Extended Global Regular Expression Print의 줄임말로, Linux/Unix 시스템에서 확장 정규 표현식을 사용하여 텍스트를 검색하는 명령어입니다. grep -E와 동일한 기능을 제공합니다.
기본 문법
기본 사용법
egrep [옵션] '패턴' [파일명...]
기본 예제:
# 파일에서 특정 문자열 검색
egrep 'error' /var/log/syslog
# 여러 파일에서 검색
egrep 'warning' /var/log/*.log
# 표준입력에서 검색
cat file.txt | egrep 'pattern'
grep vs egrep 차이점
정규 표현식 지원 비교
| 기능 |
grep |
egrep |
예제
|
| 기본 문자열 검색 |
O |
O |
grep 'hello' file.txt
|
| 확장 정규 표현식 |
X (grep -E 필요) |
O |
egrep 'hello|world' file.txt
|
| ) |
grep -E 'a|b' |
egrep 'a|b' |
직접 사용 가능
|
| 그룹화 () |
grep -E '(abc)+' |
egrep '(abc)+' |
직접 사용 가능
|
| 수량자 +, ? |
grep -E 'a+' |
egrep 'a+' |
직접 사용 가능
|
확장 정규 표현식 패턴
OR 연산자 (|)
# 'error' 또는 'warning' 검색
egrep 'error|warning' /var/log/syslog
# 여러 단어 중 하나
egrep 'apache|nginx|httpd' /var/log/access.log
# 숫자 패턴 (HTTP 상태코드)
egrep '200|404|500' access.log
그룹화 ()
# 그룹을 만들어서 OR 적용
egrep '(error|warn|fail)' /var/log/messages
# 복합 패턴
egrep '(http|https)://(www\.)?[a-zA-Z0-9.-]+' urls.txt
# 반복되는 그룹
egrep '(abc)+' file.txt # abc, abcabc, abcabcabc 매치
수량자 (+, ?, {})
# + : 1개 이상
egrep 'colou?r' file.txt # color, colour 매치
egrep 'a+' file.txt # a, aa, aaa... 매치
# ? : 0개 또는 1개
egrep 'https?' urls.txt # http, https 매치
# {n,m} : n개 이상 m개 이하
egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file.txt # IP 주소
# {n} : 정확히 n개
egrep '[0-9]{4}' file.txt # 4자리 숫자
주요 옵션
기본 검색 옵션
| 옵션 |
설명 |
예제
|
| -i |
대소문자 무시 |
egrep -i 'error|Error' file.txt
|
| -v |
매치되지 않는 라인 출력 |
egrep -v 'debug|info' log.txt
|
| -n |
라인 번호 표시 |
egrep -n 'error' file.txt
|
| -c |
매치된 라인 수만 출력 |
egrep -c 'warning' *.log
|
| -l |
매치된 파일명만 출력 |
egrep -l 'error' *.log
|
| -L |
매치되지 않은 파일명 출력 |
egrep -L 'success' *.log
|
고급 옵션
# 컨텍스트 라인 출력
egrep -A 3 -B 3 'error' file.txt # 매치 전후 3라인 출력
egrep -C 5 'error' file.txt # 매치 전후 5라인 출력
# 재귀 검색
egrep -r 'error|warning' /var/log/ # 디렉토리 하위 모든 파일
# 파일 타입 제한
egrep -r --include='*.log' 'error' /var/log/
egrep -r --exclude='*.tmp' 'pattern' /path/
# 색상 출력
egrep --color=always 'error|warning' file.txt
실무 활용 예제
로그 분석
# HTTP 상태코드 분석
egrep ' (200|404|500) ' /var/log/apache2/access.log
# IP 주소 추출
egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log
# 에러 레벨 분류
egrep -i '(error|critical|fatal|panic)' /var/log/syslog
# 시간대별 로그 필터링
egrep '^[A-Z][a-z]{2} [0-9]{1,2} (09|10|11):' /var/log/messages
시스템 모니터링
# 프로세스 모니터링
ps aux | egrep '(apache|nginx|mysql)'
# 메모리 사용량 체크
free -h | egrep '(Mem|Swap):'
# 디스크 사용량 확인
df -h | egrep '([8-9][0-9]%|100%)' # 80% 이상 사용률
# 네트워크 연결 상태
netstat -an | egrep '(LISTEN|ESTABLISHED)'
설정 파일 분석
# Apache 가상호스트 설정
egrep -i '(virtualhost|servername|documentroot)' /etc/apache2/sites-available/*
# SSH 설정 확인
egrep '^(Port|PasswordAuthentication|PubkeyAuthentication)' /etc/ssh/sshd_config
# MySQL 설정
egrep '^(bind-address|port|max_connections)' /etc/mysql/my.cnf
복잡한 패턴 예제
이메일 주소 검색
# 기본 이메일 패턴
egrep '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt
# 특정 도메인만
egrep '[a-zA-Z0-9._%+-]+@(gmail|yahoo|naver)\.com' emails.txt
전화번호 패턴
# 한국 휴대폰 번호
egrep '01[0-9]-[0-9]{3,4}-[0-9]{4}' contacts.txt
# 다양한 형식 허용
egrep '01[0-9][-. ]?[0-9]{3,4}[-. ]?[0-9]{4}' contacts.txt
URL 패턴
# HTTP/HTTPS URL
egrep 'https?://[a-zA-Z0-9.-]+(/[a-zA-Z0-9./_-]*)?(\?[a-zA-Z0-9=&_%+-]*)?' urls.txt
# 도메인만 추출
egrep -o 'https?://[^/]+' urls.txt
파이프라인과 조합
다른 명령어와 연계
# tail과 조합 (실시간 로그 모니터링)
tail -f /var/log/syslog | egrep --color '(error|warning|critical)'
# sort와 조합 (빈도 분석)
egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | sort | uniq -c | sort -nr
# awk와 조합 (특정 컬럼 추출)
egrep '(GET|POST)' access.log | awk '{print $1, $7}'
# head와 조합 (상위 결과만)
egrep 'error' /var/log/messages | head -20
복합 필터링
# 여러 조건을 AND로 연결
egrep 'error' /var/log/syslog | egrep 'apache'
# NOT 조건과 조합
egrep 'error|warning' /var/log/messages | egrep -v 'debug'
# 시간 범위 필터링
egrep '^Dec (0[1-9]|1[0-9]|2[0-9]|3[01]) (0[8-9]|1[0-7]):' /var/log/syslog
성능 최적화
효율적인 패턴 작성
# 비효율적인 패턴
egrep '.*error.*|.*warning.*' large_file.log
# 효율적인 패턴
egrep 'error|warning' large_file.log
# 앵커 사용으로 성능 향상
egrep '^ERROR:' log_file.txt # 라인 시작부터 매치
egrep 'completed$' log_file.txt # 라인 끝에서 매치
대용량 파일 처리
# 압축 파일 직접 검색
zegrep 'error|warning' compressed.log.gz
# 여러 파일을 병렬로 검색
find /var/log -name "*.log" -print0 | xargs -0 -P 4 egrep -l 'error'
# 메모리 사용량 제한
egrep --mmap 'pattern' large_file.txt
실무 스크립트 예제
로그 분석 스크립트
#!/bin/bash
# 시스템 상태 체크 스크립트
LOG_FILE="/var/log/syslog"
REPORT_FILE="/tmp/system_check_$(date +%Y%m%d_%H%M%S).txt"
echo "=== 시스템 에러 분석 ===" > $REPORT_FILE
echo "분석 시간: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 에러 통계
echo "=== 에러 레벨별 통계 ===" >> $REPORT_FILE
egrep -i '(error|critical|alert|emergency)' $LOG_FILE | \
egrep -o '(error|critical|alert|emergency)' | \
sort | uniq -c | sort -nr >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 최근 에러 로그
echo "=== 최근 10개 에러 ===" >> $REPORT_FILE
egrep -i 'error' $LOG_FILE | tail -10 >> $REPORT_FILE
echo "분석 완료: $REPORT_FILE"
웹서버 모니터링 스크립트
#!/bin/bash
# 웹서버 액세스 로그 분석
ACCESS_LOG="/var/log/apache2/access.log"
echo "=== HTTP 상태코드 통계 ==="
egrep -o ' [0-9]{3} ' $ACCESS_LOG | sort | uniq -c | sort -nr
echo ""
echo "=== 가장 많이 요청된 페이지 TOP 10 ==="
egrep 'GET' $ACCESS_LOG | egrep -o '"GET [^"]*"' | sort | uniq -c | sort -nr | head -10
echo ""
echo "=== 에러 상태코드 (4xx, 5xx) 상세 ==="
egrep ' (4[0-9]{2}|5[0-9]{2}) ' $ACCESS_LOG | tail -20
트러블슈팅
일반적인 문제들
| 문제 |
원인 |
해결방법
|
| 패턴이 매치되지 않음 |
특수문자 이스케이프 필요 |
egrep '\$[0-9]+' file.txt
|
| 너무 많은 결과 |
패턴이 너무 광범위 |
더 구체적인 패턴 사용
|
| 성능이 느림 |
비효율적인 정규식 |
앵커(^, $) 사용으로 최적화
|
| Binary file 경고 |
바이너리 파일 검색 |
egrep -a 옵션 사용
|
디버깅 팁
# 패턴 테스트
echo "test string" | egrep 'test|string'
# 매치된 부분만 출력 (-o 옵션)
egrep -o '[0-9]+' file.txt
# 패턴 설명 (GNU grep)
egrep --help | egrep -i 'regexp'
fgrep, rgrep와의 비교
명령어별 특징
| 명령어 |
정규식 지원 |
성능 |
적합한 용도
|
| grep |
기본 정규식 |
중간 |
일반적인 검색
|
| egrep |
확장 정규식 |
중간 |
복잡한 패턴 검색
|
| fgrep |
문자열만 (정규식 X) |
빠름 |
단순 문자열 검색
|
| rgrep |
기본 정규식 |
중간 |
재귀 검색 (grep -r과 동일)
|
실무 권장사항
패턴 작성 가이드라인
효율적인 패턴 작성 원칙:
- 구체적인 패턴 사용 (.*보다는 정확한 문자 클래스)
- 앵커 활용 (^, $)으로 검색 범위 제한
- 적절한 수량자 사용 (+, ?, {n,m})
- 그룹화 적극 활용으로 가독성 향상
보안 고려사항
# 민감한 정보 검색 시 주의
egrep -i '(password|secret|key)' /var/log/application.log
# 로그 파일 권한 확인
ls -la /var/log/*.log | egrep '^-.*r.*'
참고 자료
관련 명령어
- grep: 기본 패턴 검색
- fgrep: 고정 문자열 검색 (빠름)
- rgrep: 재귀 검색
- zgrep, zegrep: 압축 파일 검색
- pgrep: 프로세스 검색
정규 표현식 참고
# 정규식 테스트 도구
man 7 regex # 정규식 매뉴얼
egrep --help # 도움말
info grep # 상세 정보