[Linux] grep, egrep, fgrep

■ grep 명령어

grep명령어는 정규식으로 표현한 특정 패턴을 찾아 검색 후 출력해주는 명령어이다.

 

여기서 정규식이란 어떤 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 언어이다.

주로 문자열을 검색할 때 사용된다.

 

이처럼 grep명령어는 정규식을 사용하여 특정 패턴(문자열)을 찾는 명령어이다.

 

정규식으로 표현한 기호에는 다음과 같은 것들이 있다.

기호 의미
.  종류에 상관없는 한 글자 
 *  길이에 상관없는 문자열 
^ 라인의 첫 시작 예)^d d로 시작하는 라인
$ 라인의 마지막 위치 예)c$ c로 끝나는 라인
[] 한 문자 길이의 패턴들 예)[ab] a,b중 한글자라도 반드시 있는 단어
[^ ] 입력된 문자들의 여집합 예)[^ab] a,b중 한글자라도 없는 단어
\ 정규식에 사용되는 문자를 그대로 이용
\< 단어의 시작 위치 예) \<love love로 시작하는 단어를 포함하는 행과 대응
\> 단어의 마지막 위치 예) \>love love로 끝나는 단어를 포함하는 행과 대응 

 

먼저 grep 명령어에 어떠한 옵션 명령어가 있는지 알아보자.

 

-v : 지정한 패턴(문자열)과 일치하지 않는 것들을 보여준다.

-n : 패턴을 포함하는 줄을 출력할 때 줄번호와 함께 출력한다. 

-i : 대 소문자의 구별을 하지 않는다.

-c : 패턴과 일치하는 라인의 수를 출력해준다.

-C [num] : 지정한 num 라인만큼 일치하는 라인의 위와 아래의 내용을 보여준다.

-A [num] : 지정한 num 라인만큼 일치하는 라인의 뒤의 내용까지 보여준다.

 -v : 지정한 패턴(문자열)을 일치하지 않는 것들을 보여준다.

 

지정한 문자열과 일치하지 않는 것들을 보여준다.

-v 옵션을 명령어를 사용할 경우 root라는 문자열이 들어있지 않는 행 만을 출력하여 보여주는 것이다.

 

 

 

-n: 패턴을 포함하는 줄을 출력할 때 줄번호와 함께 출력한다. 

지정한 문자열과 일치하는 라인(줄)을 보여주고, 그 파일에서의 결과 라인이 몇 번째 행인지 같이 출력된다.

한번 실습을 통해 자세히 알아보자.

아래 그림을 보면 etc라는 문자열이 들어있는 라인의 결과와 그 결과 라인이 10번째 줄, 31번째 줄, 34번째 줄에 속해 있는 것을

알 수 있다. 

-i : 대 소문자의 구별을 하지 않는다.

찾은 문자열에 대해서 대ㆍ소문자를 구별하지 않고 보여주게 하는 옵션 명령어이다. grep 명령어는 기본적으로 대ㆍ소문자를 구별하여 내용을 출력하게 된다. 하지만 이 옵션을 사용하게 되면 대ㆍ소문자를 구별없이 찾아주게 되는 것이다.

다음은 i 옵션을 사용하지 않은 예이다. file1에 들어있는 내용 중에 jo라는 문자열이 들어간 행을 찾은 결과, 한개의 행만 출력되었다.

이번에는 i옵션을 같이 사용하여 출력한 예이다.

i옵션을 사용한 결과 대ㆍ소문자가 섞인 행이 2개 더 있다는 것을 보여준다.

 

-c : 패턴과 일치하는 라인의 수를 출력해준다.

찾으려는 문자열이 있는 행이 몇개 인지 라인의 수를 보여주는 옵션 명령어이다.

아래 그림에서 /etc/passwd 파일 내용 중에 etc라는 문자열이 들어가 있는 라인을 찾는데, -c 옵션을 사용하여

출력한 결과를 보여주고 있다.

찾은 결과 3개의 행에 etc라는 문자열이 포함되어있다고 출력된다.

-C [num] : 지정한 num 라인만큼 일치하는 라인의 위와 아래의 내용을 보여준다.

찾으려는 문자열이 들어간 라인의 위 아래의 내용을 지정한 숫자만큼 보여주는 명령어이다.

이때 숫자를 지정해주지 않으면 에러메시지가 출력되니, 반드시 숫자를 지정해주자.

아래 그림을 보면 root라는 문자열이 들어간 행이 2개가 출력되었는데 그 위 아래로 3행씩 더 보여주는 것을 알 수 있다.

 

-A [num] : 지정한 num 라인만큼 일치하는 라인의 뒤의 내용까지 보여준다.

이 옵션은 찾으려는 문자열과 일치하는 라인의 뒤에 내용을 지정한 숫자만큼 보여주는 옵션 명령어이다.

위의 -C 옵션이 위 아래로 내용을 보여주는 명령이였다면, -A 옵션은 뒤에 내용 즉, 아래의 내용을 보여준다. 

아래 그림을 보면 root라는 문자열이 들어간 라인 행에서 아래의 2개 라인의 내용을 더 보여주는 것을 확인할 수 있다.

 

▶ 정규표현식을 사용하는 grep의 예제 

grep 명령어와 정규식을 같이 사용하는 경우에는 파일에서 특정 문자열을 찾는데 사용하기보다는 

여러 가지 명령어를 파이프라인을 통해 연결하여 많이 사용한다.

 

# ls -l /var/log | grep "^d"

(/var/log 디렉토리의 파일 리스트 중에 파일을 제외한 디렉토리만을 출력한다.)

 

# grep -n 'e$' /etc/inittab

(/etc/inittab에 내용 중 문자 e로 끝나는 라인의결과와 행번호를 함께 출력한다.)

 

# grep '^[xe]' /etc/inittab

(/etc/inittab 내용 중 문자 x나 e로 시작하는 모든 행을 출력한다.)

 

# ls -l /root | grep .txt*

(/root 디렉토리의 파일 리스트 중 .txt로 끝나는 확장자를 가진 모든파일들을 검색하여 출력한다.)

 

# grep NW d* 

(d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.

 

# grep '^[we]' datafile 

(w나 e로 시작하는 모든 행을 출력한다.)

 

# grep 'TB Savage' datafile 

(TB Savage를 포함하는 모든 행을 출력한다.)

 

# grep '[A-Z][A-Z] [A-Z]' datafile 

(대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep "^c.*3$" test.txt

(시작문자가 "c", 마지막 문자가 "3"으로 끝나는 문자열을 포함하고 있는 문장을 검색하여 출력한다.)

 

# grep ".*1" test.txt

(grep 명령어를 사용하여 test.txt 파일 내용 중 "1"을 포함하고 있는 모든 문장을 검색하여 출력한다.)

 

 

 

■ egrep 명령어

egrep명령어는 grep명령어와 다르게 패턴이 정규식이 아닌 확장 정규식을 사용하여

더 많은 다양한 패턴을을 찾아 검색할 수 있는 명령어이다.

 

사용 방법

# egrep [Option] 패턴 file_name

 

다음 그림을 보자.

/etc/passwd 파일의 내용 중 sshd와 root라는 특정 패턴을 찾기 위해 따로 검색하여 출력하였다.

이러한 경우 egrep명령어를 사용하여 한꺼번에 처리할 수 있다.

즉 egrep명령어는 찾고자 하는 여러개의 문자열을 |을 통해 연결하여 한꺼번에 처리할 수 있다.

 

■ fgrep 명령어

fgrep명령어는 fast grep의 약어로 고속 검색 프로그램으로 개발되었다. 

즉, grep이나 egrep와 다르게 정규식을 전혀 사용하지 않고 입력한 패턴을 그대로 인식한다.

따라서 고정 문자열을 검색할 때 grep보다 처리 속도가 훨씬 빠르다.

 

사용 방법

#fgrep [option] 패턴 file_name

 

Ex> 다음은 fgrep명령어의 실행 예이다.

다음 그림처럼 fgrep명령어는 '>&'기호를 그대로 인식하여 출력하기 때문에 처리속도가 빠르다.

출처 : http://cafe.naver.com/linuxs.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=12&(네이버 리눅스 스터디)

 

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.※

Designed by JB FACTORY