[Linux] grep, egrep, fgrep
- Operating System/Linux
- 2020. 5. 17.
■ 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&(네이버 리눅스 스터디)
※도움이 되셨다면 광고클릭 한번 부탁드립니다.※
'Operating System > Linux' 카테고리의 다른 글
[Linux] CentOS, RHEL - EPEL (0) | 2020.09.15 |
---|---|
[Linux] history - 이전 명령어 실행 방법 (0) | 2020.08.31 |
[Linux] 특정 디렉토리의 파일 대소문자 변환 (0) | 2020.05.06 |
[Linux] VNC 설정 (0) | 2020.05.02 |
[Linux] TCP Port에서 사용중인 프로그램 알아내기 (0) | 2020.04.30 |