Today I Learn - 32

이정빈·2021년 3월 30일
0

클라우드 엔지니어

목록 보기
33/53
post-thumbnail

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

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+
[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

profile
WAS Engineer, Cloud Engineer(지망)

0개의 댓글