ENCORE CLOUD ARCHITECTURE TIL 3/30 Linux 쉘 스크립트

신민창·2021년 3월 30일
0

TIL

목록 보기
31/46

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

실습

  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

0개의 댓글