본문 바로가기
클라우드 아키텍트 양성과정

쉘 프로그래밍 grep과 정규화 표현식

by 종바깅 2021. 5. 12.

grep과 정규화 표현식

grep(Globally Regular Expression Print)

  • 파일 내에서 사용자가 지정한 내용을 검색
  • 검색 내용 부분에는 정규화 표현식(Regular Expression)을 사용
  • 검색된 내용을 화면에 출력
  • 일부 옵션의 경우 검색된 내용이 출력되지 않음
  • 검색 실행 시 검색 대상 파일에는 영향을 미치지 않음
  • ASCII, 즉 텍스트 데이터를 대상으로만 사용 가능

옵션

  • -c : 패턴을 찾고 찾은 패턴이 들어있는 줄 수를 출력(패턴 갯수가 아님에 주의)
  • -i : 대소문자 구분을 하지 않음(모든 패턴 내 글자에 대해 적용)
  • -l : 패턴을 찾고, 출력하지 않으면서 패턴이 들어있는 파일의 먹럭민 츨략
  • -n : 패턴을 찾은 후 출력되는 라인 앞에 줄 수를 표시
  • -v : 찾고자 하는 패턴이 들어있지 않은 줄만 표기
  • -w : 단어 단위로 찾고자 하는 내용이 있는지 확인
    • 단어단위 : 앞뒤로 공백, 특수문자 등이 위치

정규화 표현식

  • 검색에 사용되는 패턴
  • vi, grep, sed, awk 등 텍스트를 다루는 다양한 도구에서 사용
  • 사용형식
    • /RE/ : vi, sed, awk
    • 'RE' : grep

정규화 표현식 주요 패턴

  • ^[pattern] : 패턴의 모양으로 시작하는 라인만 검색

    • '^root'
  • [pattern]$ : 패턴의 모양으로 줄이 끝나는 라인만 검색

    • 'root$'
  • \<, \> : 단어 단위의 시작과 끝을 나타내는 패턴, 조합하면 -w

    • '\<hello'
    • grep '\<hello\>' = grep -w hello
  • . : 한 글자, 영문자(대/소), 특수문자, 공백(스페이스, 텝)

    • '.......'어떤 글자든지 총 7글자
  • [pattern]* : 패턴이 0번 이상 반복

    • 'a* : '', 'a', 'aa', 'aaa', 'aaaaaaaaaaaaaaa'.....
    • .* : '', '.', '..', '...', '............'.... → 아무거나, 모든 문자들
      • semanage fcontext -a -t [타입] '/wwwroot(/.*)?'
  • [문자들의 집합] : 집합에 포함된 글자들 중 한글자

    • [abc] : a,b,c 중 한글자
    • [a-z] : 소문자 중 한 글자
    • [0-9] : 숫자 중 한 글자
    • [a-z0-9] : 소문자, 숫자 중 한 글자
    • [Nn]ice : Nice or nice
  • [^문자들의 집합] : 집합에 포함되지 않은 글자들 중 한글자

    • [^abc] : a,b,c를 제외한 글자들 중 한 글자
    • [^0-9] : 숫자가 아닌 한 글자
  • \ : Escape Sequence. 메타문자를 일반특수문자로 변환

    • \* : '*' 일반특수문자

파일명 대체 메타문자

  • * : 모두 다 대체
  • ? : 한 글자 대체. /etc/?asswd

grep 연습 - datafile 내에서 다음 내용을 검색하시오

# n 글자로 시작하는 라인을 찾기
grep '^n' datafile

# 4 로 끝나는 라인을 찾기
grep '4$' datafile

# 다음을 각각 검색해 보시오
grep TB Savage datafile : TB를 Savage 파일과 datafile 파일에서 검색
grep 'TB Savage' datafile : TB Savage 를 datafile 파일에서 검색

# 숫자 5 뒤에 점(.)이 들어있는 라인을 찾기
grep '5\.' datafile

# 점 뒤에 숫자5가 들어있는 라인을 찾기
grep '\.5' datafile

# w 또는 e로 시작하는 라인을 찾기
grep '^[we]' datafile

# M이 포함되어 있지 않은 라인을 찾기
grep '[^M]' datafile : M이 아닌 한 글자가 포함되어 있는 라인
grep -v 'M' datafile : M이 들어있는 라인을 제외하고 출력
grep '^[^M]*$' datafile : M이 아닌 어떤 글자가 0번 이상 포함된 라인을 출력

# 대문자 두 글자 뒤 공백 한 글자, 다시 대문자 한 글자가 들어있는 라인을 찾기
grep '[A-Z][A-Z] [A-Z]' datafile
[[:upper:]], [[:alpha:]], [[:digit:]] : https://support.google.com/a/answer/1371415?hl=ko

# s가 한 글자 이상 반복되는 라인을 찾기
grep 'ss*' datafile

확장 정규화 표현식

확장정규화 표현식 주요 패턴

  • ( ) : 패턴이 적용되는 부분을 묶어주기
  • [pattern]+ : 패턴이 1번 이상 반복
    • ss* = s+
    • abc+= abc,abcc,abccc ...
    • (abc)+ = abc, abcabc, abcabcabc ...
  • [pattern]? : 패턴이 없거나, 1번 포함
    • abc? : ab or abc
    • (abc)?: abc or 아무것도 없음
    • semanage fcontext -a -t [타입] '/wwwroot(/.*)?'
  • [pattern1]|[pattern2] : or, 패턴1 또는 패턴2
    • [Nn]ice = (N|n)ice
  • [pattern]{ } : 패턴의 반복회수 지정
    • [pattern]{ n } : 패턴이 n번 반복
    • [pattern]{ n,m } : 패턴이 n번 이상 m번 이하
    • [pattern]{n, } : 패턴이 n번 이상
    • [pattern]{,m} : 패턴이 m번 이하
  • 확장 정규화 표현식은 grep 에서는 사용 불가능 → egrep에서 사용가능
    • egrep : 확장정규화 표현식 사용, grep -E 와 동일
    • fgrep : 정규화표현식을 사용하지 않음 (fixed grep), 패턴을 일반 특수문자로 처리, grep -F와 동일

egrep 연습 - datafile로부터 검색

# NW 또는 EA 패턴을 검색
egrep '(NW|EA)' datafile

# '3' 숫자가 1번 이상 반복
egrep '3+' datafile

# 2.x 또는 2x 패턴이 들어있는 라인 (x는 숫자)
egrep '2\.?[0-9]' datafile

# no 패턴이 1번이상 반복되는 라인
egrep '(no)+' datafile

# Sh 또는 Su 라는 패턴이 들어있는 라인
grep 'S[hu]' datafile
egrep 'S(h|u)' datafile
egrep '(Sh|Su)' datafile

실습문제 - databook파일로부터 검색

1. San을 포함하고 있는 모든 줄을 출력하시오.
 grep 'San' databook

2. 사람의 이름이 J로 시작하는 모든 줄을 출력하시오.
 grep '^J' databook

3. 700으로 끝나는 모든 줄을 출력하시오.
 grep '700$' databook

4. 834를 포함하지 않는 모든 줄을 출력하시오.
 grep -v '834' databook

5. 생일이 12월인 모든 줄을 출력하시오.
 grep ':12/' databook

6. 전화번호의 지역코드가 408인 모든 줄을 출력하시오.
 grep ':408-[0-9]' databook

7. 대문자 하나, 이어서 4개의 소문자, 콤마, 스페이스에 하나의 대문자를 포함하는 모든 줄을 출력하시오
 grep '[A-Z][a-z][a-z][a-z][a-z], [A-Z]' databook
 egrep '[A-Z][a-z]{4},. [A-Z]' databook

8. 성이 K나 k로 시작하는 모든 줄을 출력하시오.
 grep ' [Kk][a-z]*:' databook
 egrep '^[A-Za-z]+ [Kk][a-z]*:' databook

9. 급여가 6자리인 줄을 줄 번호와 함께 출력하시오.
 egrep ':[0-9]{6}$' databook

10. Lincoln 이나 lincoln을 포함하고 있는 줄을 출력하시오.
  grep '[Ll]incoln' databook
 egrep '(L|l)incoln' databook
 egrep '(Lincoln|lincoln)' databook


다음 문제에 대해서도 생각해봅시다
 1. ID@도메인 형태로 이루어진 e-mail을 검색할 수 있는 정규식을 작성하시오. (com, net, org) → UPN(User Principal Name) 형식
 egrep '[a-z][a-z0-9]*@[a-z][a-z0-9]*\.(com|net|org)' test.txt

 2. 핸드폰 번호를 검색할 수 있는 정규식을 작성하시오.
  116  egrep '^01[016789]-' test.txt
  117  egrep '^01[016789]-[0-9][0-9][0-9][0-9]?-' test.txt
  118  egrep '^01[016789]-[0-9]{3,4}-' test.txt
  119  egrep '^01[016789]-[1-9][0-9]{2,3}-' test.txt
  120  egrep '^01[016789]-[1-9][0-9]{2,3}-[0-9]{4}' test.txt
  121  egrep '^01[016789]-[1-9][0-9]{2,3}-[0-9]{4}$' test.txt

 3. IP주소를 검색할 수 있는 정규식을 작성하시오.
 egrep '.*\..*\..*\.' test.txt => 점 세개를 포함하는 패턴
 egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' test.txt

trump@whitehouse.org
trump@whitehouse
trump.whitehouse.org
trump@whitehouse@org

010-1234-5678
01-2345-6789
0111-2345-6789
019-2345-6789
010-123-4567
010-1234-567
010-1234-5678-9012

10.10.10.10
10.10.10.10.10
10.10.10
300.300.300.300
ff.ff.ff.ff

댓글