개인/리눅스

[리눅스] grep 명령어의 기본적인 사용방법

OmeGa2 2020. 3. 22. 18:52

grep 명령의 기본옵션

grep (Global Regular Expression Print)

 

텍스트 파일에서 원하는 문자열이 들어간 행을 찾아 출력하는 명령어

 

주로 log파일에서 특정 날짜, 문자로 기록된 error 메시지를 찾는데 유용하게 사용할 수 있고

리눅스를 사용하는 사람이라면 필수적으로 익혀야 하는 명령어 중 하나입니다.

 

<옵션>

]# grep 옵션 [문자열] [파일명]

-b : 문자와 일치하는 줄의 시작점 출력

-c : 문자와 일치하는 줄의 수 출력

-h : 여러 파일에서 문자열을 찾을 때, 파일이름이 붙는것을 방지

-i : 대소문자를 구분하지 않는다.

-n : 줄의 번호와 내용을 같이 출력

-v : 문자가 포함되지 않는 행 출력

-w : 문자와 한 단어로 일치해야 출력

-l : 문자가 들어간 파일 이름을 출력

-r : 하위 디렉토리에서도 문자를 찾는다.

-A : 특정문자 아래 추가로 여러 행 출력

-B : 특정문자 위 추가로 여러행 출력

 

<자주 사용하는 형식>

]# grep "^문자열"       = 문자열로 행이 시작되는 경우 출력 

]# grep "문자열&"       = 문자열로 행이 끝나는 경우 출력

]# grep "문자1\|문자2" = 여러 문자열을 한번에 검색

]# grep -A2 "문자열"    = 해당 문자열이 들어강 행을 포함해 아래 2행 출력

]# grep -v "문자열"      = 해당 문자를 제외한 행 출력

]# grep "문자열" *       = 현재 위치의 모든파일 (*)에서 특정 문자열 출력

grep 명령어의 사용법을 익힌다면 대부분의 파일에서 원하는 내용만 따로 출력하거나 저장할 수 있습니다.

특히 리다이렉션 (>,>>)과 파이프라인 ( | )을 같이 사용한다면 보다 수월하게 쓸 수 있습니다.

 

파일에서 원하는 내용을 찾을 때 가장 많이 사용되는 명령어이고 여러 파일을 동시에 검색하거나, 문자열을 이용해 근처 행까지 같이 출력하는 등 옵션이 많아 활용방안이 다양합니다.

 

 

 

 

 

grep 명령의 사용 예시

grep 사용시 파일의 원본은 그대로 유지되면서, 단지 원본 파일에서 원하는 내용만 확인하기 위해 쓰입니다.

 

 

1. 하나의 파일에서 특정 문자열 찾기

 

▶ grep "문자열" [파일이름]

]# grep "DHCPACK" messages

파일에서 특정 문자열이 들어간 행 출력

 

DHCPACK 문자가 들어간 행 출력

파일의 원본은 그대로 있으며 현재 message 파일에서 grep 명령을 이용해

DHCPACK 문자가 들어간 행만 출력한 것입니다.

 

 

 

2. 여러 파일에서 특정 문자열 찾기

 

 grep "문자열" [파일이름] [파일이름] 

]# grep "address" messages.txt messages2.txt

]# grep "address" *.txt

여러개의 파일에서 특정 문자열이 들어간 행을 출력합니다. 

파일이름은 <space>(띄어쓰기)로 구분해도 좋고, 모든파일을 뜻하는 *를 사용해도 좋습니다. 현재 위치에 있는 모든 파일 (*) 중에 원하는 문자열을 확인할 때 주로 사용됩니다.

 

현재 위치에 있는 모든 파일 중 "abc"문자열이 들어간 행을 출력하기 위해서는 grep " abc" * 을 사용합니다.

grep "[문자열]" [파일명]

 

message.txt 파일과 messages2.txt 파일의 내용은 동일합니다.

 

여기서 address 문자가 들어간 행을 출력할 때 

띄어쓰기로 파일을 구분한 명령 [grep "address" messages.txt messages2.txt]과

ALL을 뜻하는 * 문자로 구분한 명령 [grep "address" *.txt]의 내용이

동일하게 출력되는것을 확인할 수 있습니다.

 

파일이름에서 동일한 패턴을 찾아내어 * 를 활용하는 방법을 익히는게 좋습니다.

저장되는 파일의 확장자 (.txt)로 확인할 수 있는 방법을 활용해도 좋고 본인이 원하는 파일명으로 확인해도 됩니다.

 

만약 파일명이 List 일 경우 List_1 / List_2 일 때 List_*로 검색한다면 List_로 시작하는 모든 파일을 대상으로 검색할 수 있습니다.

 

 

 

 

3. 특정 문자를 제외한 행 찾기

 

grep -v "문자열" [파일이름]

]# grep -v "dhclient" messages.txt

-v 옵션은 파일에서 특정 문자를 제외한 행만 출력할 수 있습니다.

 

dhclient 문자를 제외한 행 출력

기존 messages.txt 파일에서 dhclient 문자가 들어간 행을 제외한 뒤 출력하는 명령

특정 파일에서 불필요한 내용을 지우고 싶을 때 유용하게 사용합니다.

 

 

 

 

4. 두 가지 문자열 한번에 찾기

 

▶ grep "문자열1\|문자열2" [파일이름]

]# grep "address\|prefix" messages.txt

역슬러쉬 or 달러표시 (\) 와 파이프라인 ( | ) 을 이용해

두 가지 문자열을 한 번에 검색할 수 있습니다.

 

여기서 역슬러쉬와 달러표시는 같은 의미로 사용되기 때문에 둘 중 아무거나 사용해도 무방합니다.

파이프라인은 [Shift] + [\] 로 사용할 수 있습니다.

 

messages.txt 파일에서 두 가지 문자 (address, prefix)를 한 번에 출력합니다.

egrep이나 grep -E 옵션을 이용해서 여러 문자를 출력하여 사용하는 방법도 있으나

위 방법처럼 \| 를 사용하여 여러 문자가 동시에 들어간 행을 출력하여도 무방합니다.

 

 

 

 

5. 특정 문자열의 위,아래행 추가 출력

 

▶ grep -A [문자열] [파일이름]

▶ grep -B [문자열] [파일이름]

]# grep -A2 "address" messages.txt

]# grep -B2 "domain name" messages.txt

특정 문자열을 기준으로 위, 아래행을 추가로 출력할 수 있는 옵션으로,

grep 명령어에 익숙한 사람 중에서도 생각보다 모르는 사람이 많은 옵션입니다.

 

-A, B 옵션 뒤의 숫자에 따라 원하는 행을 추가로 출력할 수 있습니다.

(-A2 abc = abc가 속하는 행과 더불어 아래 2행을 추가로 출력)

 

address 문자를 기준으로 아래 2행 추가 출력

-A옵션을 사용한 결과 address 문자가 들어간 행을 포함해서 아래 2행이 추가로 출력되었습니다.

 

domain name 문자를 기준으로 위 2행 추가 출력

원본에서 domain name 문자가 들어간 행을 포함해 위 2행이 추가로 출력되었습니다.

원하는 행 근처의 다른 내용을 추가로 확인할 때 유용하게 쓰입니다.

 

 

 

 

6. 파이프라인을 이용한 중복사용 후 별도로 저장하기

 

▶ grep "문자열" [파일이름] | grep "문자열" | grep "문자열" ...

▶ grep "문자열" [파일이름] >> [따로 저장할 파일명]

]# cat messages.txt | grep "<info>" | grep -v "address" >> test

grep 명령과 파이프라인을 같이 사용할 경우,

텍스트 파일에서 원하는 내용을 필터처럼 여러번 걸러 사용할 수 있다고 생각하면 편합니다.

문자열을 이용해 원하는 부분을 출력하거나, 지우는 등 파일을 재가공할 수 있습니다.

 

파이프라인을 이용한 중복 사용

cat messages.txt 명령으로 출력된 내용중에 파이프라인을 마치 필터처럼 사용해 원하는 내용만 걸러내는 방식으로 많이 사용됩니다.

 

cat messages.txt 명령으로 출력되는 내용 중 info 가 들어간 행만 거르고 난 뒤, 그 중 address가 들어간 행을 제거하여 추가로 필터로 거를 수 있습니다.

 

]# cat messages.txt 

 = 파일 내용 출력

 

]# cat messages.txt | grep "<info>" 

 = 파일 내용 중 <info> 문자가 들어간 행만 출력

 

]# cat messages.txt | grep "<info>" | grep -v "address"

 = 위 출력물에서 address 문자가 들어간 행 삭제

 

 

리다이렉션을 이용한 저장

최종적인 출력물을 리다이렉션을 이용해 다른 파일에 저장합니다.

저장된 test 파일을 확인해보면 위 출력물과 동일한 부분만 저장된 것을 볼 수 있습니다.