본문 바로가기
개발/linux

bash 기초 - 정규 표현식

by 가시죠 2021. 1. 18.
반응형

grep

파일을 한줄씩 읽어서 패턴을 찾고, 찾는 패턴이 있으면 그 행을 출력한다.

문법

grep [옵션들] <패턴> <파일들>

기본옵션

-c : 찾는 패턴의 행의 수를 리턴

-E : 확장 정규 표현식 문법을 활성화 (egrep를 사용하면 -E를 붙인 효과와 동일하다)

-f <파일> 지정된 파일에서 검색 패턴을 읽어, 하나 이상의 패턴을 한줄에 하나씩 담는 파일을 만든다. (결과를 파일로 저장할때 사용)

-i : 대소문자를 무시

-l : 패턴을 찾으면 파일의 경로와 파일 이름만 표시

-p : Perl 정규 표현식 엔진을 활성화

-R, -r : 하위 디렉토리들을 재귀적으로 검색

 

예시

#file2.txt 의 내용
#-----------------------------------------
안녕하세요.
그랩 테스트를 위한 텍스트 파일입니다.
hello~
1. this is grep test file
2. hello again 
3. this is egrep test file

#-----------------------------------------

$ grep "안녕" file2.txt

안녕하세요

$ grep hello file2.txt

hello~

hello again

 

메타문자

  • "." : 하나의 문자를 의미, 실제 마침표를 검색하려면 \. 로 해야 함
  • "?" : 물음표 앞의 문자는 선택적임을 알림, 생략해도 되는 문자
  • "*" : ?와 비슷하지만 *앞의 항목이 0회 이상 반복될 수 있음을 의미
  • "+" : *와 비슷하지만 0회 이상이 아닌 1회 이상 반복될 수 있음을 의미한다, 즉 +문자 앞의 항목이 1개 이상있어야함.

$ grep 't..s' file2.txt

1. this is grep test file

3. this is egrep test file

$ egrep 't.?.s' file2.txt   또는 grep -E 't.?.s' file2.txt  또는 grep 't.\?.s' file2.txt

1. this is grep test file

3. this is egrep test file

$grep 't.*s' file2.txt

1. this is grep test file

3. this is egrep test file

 

그룹묶기

$egrep 'is (grep|egrep)' file2.txt

1. this is grep test file

3. this is egrep test file

 

정규식 문자 범위

의미
[abc] 문자 a나, b, c 를 체크
[1-5] 1에서 5까지의 숫자를 체크
[a-zA-Z] a~z, A~Z까지의 영문 소문자 또는 대문자를 체크
[0-9+-*/] 숫자 및 사칙연산 기호들을 체크
[0-9a-fA-F] 16진수 숫자를 체크
[1-475] (주의)1~4까지 숫자와 7,5만 체크

 

정규식 단축 표기 (grep 에서 사용 시 -P 옵션을 줘야 함)

의미
\s 공백문자
\S 공백문자 아님
\d 숫자
\D 숫자 아님
\w 단어문자
\W 단어문자 아님
\xnn 문자의 16진 코드 (ex 0x5F)

$ grep -P '\d' file2.txt

1. this is grep test file

2. hello again~

3. this is egrep test file

 

정규식의 대괄호 문자분류 (grep에서 사용시 이중대괄호로 사용해야 함 ex. [[:digit]])

문자분류 의미
[:alnum:] 임의의 영문자와 숫자
[:alpha:] 임의의 영문자
[:cntrl:] 임의의 제어문자
[:digit:] 임의의 숫자
[:graph:] 임의의 표시 가능 문자
[:lower:] 임의의 소문자
[:upper:] 임의의 대문자
[:print:] 임의의 인쇄 가능문자
[:punct:] 임의의 문장부호
[:space:] 임의의 공백 문자
[:xdigit:] 임의의 16진수

$grep 'X[[:upper]][[:digit]]' list.txt  (list.txt 파일에서 X로 시작하는 대소문자, 숫자를 모두 찾는다.)

 

역참조 (\1 : 첫번재 참조, \2 : 두번째 참조, ...)

abcd
<div>hello</div>
1234
<u>UUU</u>
<a>a href=</aa>

위의 내용을 가지고 있는 test.txt 파일이 존재 할 경우 아래 grep 옵션에 의해 완벽한 태그(앞뒤가 같고 뒤는 /로 시작하는...)만 모두 찾는다.

$ egrep '<([A-Za-z]*)>.*</\1>' test.txt

또는

$ grep -E '<([A-Za-z]*)>.*</\1>' test.txt

<div>hello</div>
<u>UUU</u>

 

수량한정자

T{5} : T가 정확히 5번 반복된 문자열을 찾는다.

T{3,6} : T가 3회에서 6회까지 반복된 문자열을 찾는다.

 

앵커와 단어경계

^[1-5] : 문자열의 첫 글자가 1~5까지의 숫자 중 하나이어야 한다는 뜻

[1-5]$ : 마지막 문자가 1~5까지의 숫자 중 하나여야 한다는 뜻

반응형

댓글