0330_Linux_Shell Programming_03.grep
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+
- 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로 부터 검색
- 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