Linux

0330_Linux_Shell Programming_03.grep

SW Kang 2021. 4. 1. 09:16

grep (Globally Regular Expression Print)

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

 

옵션

  • -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 내에서 다음 내용을 검색하시오

  1. n 글자로 시작하는 라인을 찾기

grep ‘^n’ datafile

  1. 4 로 끝나는 라인을 찾기

grep ‘4$’ datafile

  1. 다음을 각각 검색해 보시오
    1. grep TB Savage datafile : TB를 Savage 파일과 datafile 파일에서 검색
    2. grep ‘TB Savage’ datafile : TB Savage 를 datafile 파일에서 검색
  2. 숫자 5 뒤에 점(.)이 들어있는 라인을 찾기

grep '5\.' datafile

  1. 점 뒤에 숫자5가 들어있는 라인을 찾기

grep '\.5' datafile

  1. w 또는 e로 시작하는 라인을 찾기

grep '^[we]' datafile

  1. M이 포함되어 있지 않은 라인을 찾기

grep '[^M]' datafile : M이 아닌 한 글자가 포함되어 있는 라인

grep -v ‘M’ datafile : M이 들어있는 라인을 제외하고 출력

grep '^[^M]*$' datafile : M이 아닌 어떤 글자가 0번 이상 포함된 라인을 출력

  1. 대문자 두 글자 뒤 공백 한 글자, 다시 대문자 한 글자가 들어있는 라인을 찾기

grep ‘[A-Z][A-Z] [A-Z]’ datafile

[[:upper:]], [[:alpha:]], [[:digit:]] : https://support.google.com/a/answer/1371415?hl=ko

  1. 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} alias: 패턴이 m번 이하

 

확장정규화 표현식은 grep 에서는 사용불가능 : egrep 에서 사용가능

 

egrep : 확장정규화 표현식 사용, grep -E 와 동일

fgrep : 정규화표현식을 사용하지 않음 (fixed grep), 패턴을 일반 특수문자로 처리, grep -F와 동일



egrep 연습 - datafile로 부터 검색

  1. NW 또는 EA 패턴을 검색

egrep '(NW|EA)' datafile

  1. ‘3’ 숫자가 1번 이상 반복

egrep ‘3+’ datafile

  1. 2.x 또는 2x 패턴이 들어있는 라인 (x는 숫자)

egrep ‘2\.?[0-9]’ datafile

  1. no 패턴이 1번이상 반복되는 라인

egrep ‘(no)+’ datafile

  1. 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