본문 바로가기
카테고리 없음

[Linux] 필터 명령어 grep & 정규표현식 & 메타문자 ⑦

by 떵해이 2020. 12. 13.
300x250

○ grep

    ▷ 파일 안에서 지정한 패턴 or 문자열을 찾아서 그 문자열을 포함한 행을 모두 출력

    ▷ 디렉토리 안에서도 패턴을 포함하는 파일을 찾아 출력할 수 있습니다.

    ▷ 정말 정말 유용한 명령어 입니다. 대부분은 |(파이프)와 함께 사용합니다.

 

 

대표적 사용법

# grep [옵션] [패턴/파일명]

# 다른 명령어 | grep [패턴/파일명]

 

자주 사용하는 옵션

옵   션 의   미
-c 패턴과 일치하는 행 수를 출력하는 옵션
-i 검색할 때 대소문자를 구분하지 않는 옵션
-w 단어 단위로 패턴 검색하는 옵션
-a grep은 바이너리 파일은 처리할 수 없습니다. 바이너리 파일을 텍스트 파일처럼 처리할 수 있게 해주는 옵션
-n 패턴과 일치하는 줄의 번호와 내용을 같이 출력해주는 옵션
-h 파일의 이름을 출력하지 않고 패턴에 속해있는 줄만 출력하는 옵션
-r 하위 디렉토리까지 패턴을 찾아주는 옵션
-v 패턴과 일치하지 않는 줄을 출력
-E grep은 하나의 패턴을 검색하는데 이 옵션은 |와 연계하여 여러 패턴을 검색하는 옵션

 

예시

# ll 저의 루트 홈 디렉토리의 파일 리스트

 

 

# grep -c root *

지금 작업하고 있는 디렉토리(루트 홈 디렉토리)의 모든 파일들 중에

'root'라는 문자열이 들어있는 행(줄)의 수를 출력해주는 명령어 입니다.

(*은 모든 파일을 뜻합니다.)

 

위에 보시면 anaconda-ks.cfg라는 파일에 root라는 문자열이 들어있는 줄이 2줄 있다는 뜻

test1이라는 파일에는 root라는 문자열이 없다는 뜻

 

 

# grep -h root *

위에 명령어로 알 수 있듯이 anaconda-ks.cfg 파일에 들어 있는 root라는 문자열이 포함되어 있는

줄을 출력하는 명령어 입니다. 파일명은 출력하지 않습니다.

이 파일 내용은 anaconda-ks.cfg에 있다는 것을 -c옵션으로 이미 알고 있기 때문에 내용만 보려고 출력

 

 

예시를 조금 더 들기전에 아래에 정규표현식에 대해 먼저 익숙해지고 같이 쓰는 것을

예시로 들어보도록 하겠습니다.

 

○ 정규표현식 & 메타문자

    ▷ 고정 문자열이 아니고 특정 패턴을 가진 문자열을 찾고 싶을 때 사용합니다.

     grep에서 많이 사용하지만 다른 명령어에서도 사용하고 다른 언어에서도 사용되므로

        숙지해놓으시면 될것입니다.

 

메타 문자는 정규표현식에서 특수한 의미가 있는 문자를 의미

특수 문자는 쉘에서 특별한 의미를 가지는 문자를 의미

 

자주 사용하는 메타문자 정리

메타문자 의   미 예   시 설   명
^ 행의 시작 '^linux' linux로 시작하는 행
$ 행의 끝 'linux$' linux로 끝나는 행
\< 단어의 시작 '\<linux' linux로 시작하는 단어를
포함하는 행
\> 단어의 끝 'linux\>' linux로 끝나는 단어를
포함하는 행
. 문자 한개를 대응 'l...x' l과 x사이에 세글자만 있을 수 있음
? 한개의 문자와 매칭 'lin?x' ?에 문자하나가 들어가는 것을 검색
* 아무 뜻이 없거나 공백이거나 임의의 문자열을 나타냄 'linux*'
'lin*'
'l*x'
'*linux'
linux를 모두 검색
(여러 파일의 이름을 표현할 때 사용하고, 단독으로 * 사용하면 모든 파일을 나타냄)
| 파이프랑 똑같은 기호로서 또는 이라는 뜻으로 사용 'ab|cd|ef' ab나 cd나 ef 셋 중 하나라도 들어있으면 검색
\(\) 특정 기호 or 메타 문자를 무시
(문자 그 자체를 나타냄)
'lin\.\x' .문자를 대응하는 것이 아니라 lin.x라는 것을 검색
[] []는 안에 내용을 넣어 그 문자들 중 한문자를 의미 'linux[123]' linux1, linux2, linux3을 검색
[0-9], [a-z] 숫자나 알파벳은 범위로 설정 가능 'linux[0-9]' linux1부터 linux9까지 검색
[^] []안에 있는 ^는 부정을 의미
안에 있는 문자를 제외한다는 뜻
'linux[^1-3]' linux1 부터 linux3까지를 제외한 문자 검색
\<\> \<는 단어의 시작
\>는 단어의 끝
(위에 있는 지시자 합친것)
'\<linux\>' linux로 시작하는 단어, linux로 끝나는 단어 검색
예를 들어 alinux2와 같이 중간에 linux가 있는 것은 안됨
a\{n\} 문자 a를 n번 반복 'a\{2\}' a 문자가 2번 연속 반복되는 것을 검색
a\{n,\} 문자 a를 적어도 n번 반복 'a\{2,\}' a 문자가 최소한 2번 반복되는 것을 검색
a\{m,n\} 문자 a를 최소 m번 이상으로 반복하고, n번 이하로 반복되는 부분 'a\{2,4\}' a 문자가 2번 이상으로 반복하고 4번 이하로 반복되는 부분
\(..\) 다음 사용을 위해 태그를 붙이는 역할
최대 9개까지 사용가능
\(linux\)A\1B linuxA에 \1이 태그되어
linuxAlinuxB로 대응

 

여기있는 메타 문자들은 grep명령어와 함께 사용하는 부분이 많습니다.

vi 편집기 안에서도 vi명령어와 함께 이런 문자들이 많이 사용되고 있습니다.

 

grep과 함께 쓰는 예시

 

파일명자리에는 디렉토리,파일명 포함

 

# grep "[lL]inux[1-4]" [파일명]

결과 : 파일안에서 linux1부터 4까지 or Linux1부터 4까지 찾기

 

# grep "^[a-c]" [파일명]

결과 : 파일안에서 a,b,c로 시작하는 행 찾기

 

# grep "^[^a-z]" [파일명]

결과 : 파일안에서 소문자를 제외한 문자로 시작하는 행 찾기

 

# grep "[1-6]" [파일명]

결과 : 숫자 1부터 6까지 들어있는 행 찾기

 

# grep "[^sl]" [파일명]

결과 : 파일안에서 s나 l이 들어있지 않는 행 찾기

 

# grep "li*" [파일명]

결과 : 파일안에서 li로 시작하는 모든 단어를 찾기 (공백 포함)

 

# grep -v ^# [파일명]

결과 : 파일안에서 #으로 시작하지 않는 행 찾기

 

# grep "\.txt" [파일명]

결과 : 파일안에서 .txt나오는 행 찾기

 

# grep "\<[1-9]*linux\>" [파일명]

결과 : 파일안에서 [1-9]로 시작하고, 공백포함한 임의 문자가 있고, linux로 끝나는 단어를 포함한 행 찾기

 

# grep "[X,Y,Z]$" [파일명]

결과 : 파일안에서 X, Y, Z로 끝나는 행 찾기

 

# grep "e\{2\}" [파일명]

결과 : 파일안에서 e가 연속으로 2번 있는 문자를 찾기

 

# grep "a\+b" [파일명]

결과 : 파일안에서 ab가 붙어있는 문자를 찾기

 

 

특수 문자 (쉘에서 사용)

특수 문자 의   미
~ 홈 디렉토리
. 현재 디렉토리
.. 상위 디렉토리
# 주석
$ 쉘 변수
& 백 그라운드로 실행
; 쉘 명령 구분자
반응형

댓글