article thumbnail image
Published 2021. 6. 8. 18:51
728x90
반응형

grep 명령어

grep 명령어는 입력으로 전달된 파일에서 특정 문자열을 찾을 때 사용하는 명령어다.
쉽게 말해서 원하는 문자나 문자열을 찾을 때 사용한다.
특정 문자열을 찾는 것 뿐만 아니라
특정 문자열을 제외한 나머지 내용을 출력하거나
특정 문자열을 기준으로 앞 뒤 내용을 출력할 수 있다.

# grep [option] ... "특정 문자열" [file] ...

[옵션]
-A num, --after-context=num: 특정 문자열로부터 num 이후의 라인까지 출력
-B num, --before-context=num: 특정 문자열로부터 num 이전의 라인까지 출력
-C num, --context=num: 특정 문자열로부터 num 이전,이후의 라인까지 출력 (-A num -B num 과 같다)
--colour, --color=[when]: 특정 문자열을 특정 색으로 표시 ([when] = never, always, auto)
-d action, --directories=action: 특정 디렉토리에서 특정 문자열 검색
-e pattern, --regexp=pattern: 여러 특정 문자열로 검색, 한 번에 2개 이상의 특정 문자열로 검색할 때 사용
-i, --ignore-case: 특정 문자열을 대소문자 구분 없이 검색
-v, --invert-match: 특정 문자열을 제외한 나머지 행을 검색
-w, --word-regexp: 다른 문자열이 포함되지 않은 특정 문자열'만' 검색, 특정 문자열을 하나의 단어로 취급

이외의 다양한 옵션이 존재하지만 자주 사용하는 옵션만 정리했다.
추가적으로 궁금한 옵션에 대해서는 따로 찾아보자 !

 

추가적으로 grep 명령어를 먼저 사용했지만 파이프 ( | ) 를 사용해서 원하는 입력을 파이프로 받아와 grep 명령어를 사용할 수도 있다.
예를 들어

grep "jaynam" testfile.txt

또는

cat testfile.txt | grep "jaynam"

 

 

grep 명령어 옵션 사용

우선 명령어를 사용해보기 위해서 영문으로 된 긴 문장을 가져와 텍스트 파일(lorem_ipsum.txt)로 만들었다.

이 문장을 통해 grep 명령어를 사용해보려고 한다.

 

특정 문자열을 기준으로 원하는 이전 내용과 이후 내용 출력해보기

이전 내용과 이후 내용을 출력하기 위해서는 옵션 중에서 -A, -B, -C 를 사용해야 한다.
예를 들어, 문장 속에 "felis" 이란 문자열을 기준으로 이전 3번째 줄까지 출력하고 싶어!
그럼 다음과 같이 옵션을 사용해 출력해볼 수 있다.

grep -B 3 "felis" lorem_ipsum.txt

또는 

cat lorem_ipsum.txt | grep -B 3 "felis"

결과를 확인해보면 felis 라는 문자열이 2개가 검색된 것을 확인할 수 있고
-B 옵션을 통해 검색된 2개의 문자열 이전 3번째 줄까지 출력된 것을 확인할 수 있다.
마찬가지로 -A 옵션을 사용하게 되면 이후 3번째 줄까지 출력될 것이다.

 

다른 예를 들어보자.
문장 속에서 "felis"이란 문자열을 기준으로 이전과 이후의 2번째 줄까지 출력하고 싶어!
그럼 다음과 같은 옵션을 사용하면 된다.

grep -C 2 "felis" lorem_ipsum.txt

또는

cat lorem_ipsum.txt | grep -C 2 "felis"

결과를 확인해보니 아까는 이전 3번째 줄까지 출력된 것과는 달리 -C 옵션을 통해 앞 뒤 2번째 줄 모두 출력한 것을 확인할 수 있다.
그리고 두 가지의 결과를 통해 볼 수 있는 공통점은 바로 검색한 특정 문자열이 빨간색으로 표시되어있는 것이다.
옵션을 추가하지 않아도 자동 특정 색으로 되는 것을 알 수 있다. 특정색으로 표시되지 않는다면 --color 옵션을 통해 표시할 수 있다.

 

여러 특정 문자열로 검색해보기

하나의 특정 문자열이 아닌 여러 특정 문자열을 검색하려면 -e 옵션을 통해 여러 특정 문자열을 검색해주어야 한다.
예를 들어, 위에서 만들어 놓은 텍스트 파일에서 "libero" 와 "Nam" 이라는 문자열 2개를 동시에 찾고싶어!
다음과 같이 검색할 수 있다.

grep -e "libero" -e "Nam" lorem_ipsum.txt

또는 

cat lorem_ipsum.txt | grep -e "libero" -e "Nam"

결과를 확인해보니 "libero" 와 "Nam" 문자열 2개를 동시에 검색한 것을 확인할 수 있다.
2개 뿐만 아니라 더 많은 문자열을 동시에 검색할 수 있다.
그리고 -e 옵션을 더 확장된 명령어인 egrep 명령어를 통해서 여러 문자열을 더 편리하게 검색할 수 있다.
egrep 명령어를 사용하는 방법은 이렇게 사용할 수 있다.

egrep "libero|Nam" lorem_ipsum.txt

또는 

cat lorem_ipsum.txt | egrep "libero|Nam"

달라진 점이라면 -e 옵션 대신 정규표현식인 파이프(|)를 사용해서 여러 문자열을 검색한다는 점이다.

 

특정 문자열을 대소문자 구분 없이 찾아보기

원하는 문자열을 대소문자 구분 없이 검색하려면 -i 옵션을 사용하면 된다.
예를 들어, "in" 이란 문자열을 대소문자 구분 없이 찾고 싶다!

grep -i "in" lorem_ipsum.txt 

또는

cat lorem_ipsum.txt | grep -i "in"

결과를 확인해보면 "in" 과 "In" 두 개의 문자열이 검색된 것을 확인할 수 있다.

그런데 잘 보면 in 이 포함된 모든 문자열이 검색된 것을 확인할 수 있다.
그럼 in 문자'만' 들어간 문자열만 검색하려면 어떻게 해야할까?

 

특정 문자열만 포함된 문자열 검색하기

특정 문자열만 포함된 내용만 검색하려면 -w 옵션을 사용하면 된다.
-w 옵션은 특정문자열을 하나의 단어로 취급하기 때문에 다른 문자가 포함되지 않은 특정 문자열만 찾게 된다.

grep -w "in" lorem_ipsum.txt

또는

cat lorem_ipsum.txt | grep -w "in"

아까는 "in" 이라는 문자열이 포함된 내용 모두 찾았었는데 지금은 in 이라는 문자열만 찾았다.
따라서, -w 옵션을 사용하게 되면 특정 문자열을 하나의 단어로 취급하기 때문에 다른 문자가 포함되지 않은 내용만 가져온다.

 

특정 문자열을 제외한 내용 찾아보기

특정 문자열을 찾는게 아니라 불필요한 내용을 제외시키거나 특정 문자열을 제외한 내용이 필요한 경우도 있다.
이럴 때 사용하는 옵션이 -v 옵션이다. 정말 많이 사용하는 옵션 중 하나라고 해도 무방하다. ㅎㅎ

예를 들어, 나는 콤마(,) 가 들어간 내용을 제외하고 싶어!

grep -v "," lorem_ipsum.txt

또는

cat lorem_ipsum.txt | grep -v ","

원래의 문장에서 콤마(,) 를 제외한 내용이 출력된 것을 확인할 수 있다.

 

이렇게 간단한 예를 들면서 grep 명령어를 사용해봤는데
다양한 데이터나 로그 등에서 에러난 부분이나 장애난 부분을 찾아보고 싶거나
원본의 데이터를 통해 원하는 값을 가져와 스크립트를 작성하고자 할 때 정말 많이 사용하는 명령어라고 생각한다.

 

grep 명령어 하나만 잘 사용해도 원하는 값을 가져올 수 있을 만큼 잘 사용하면 좋은 명령어기 때문에
grep 명령어에 대한 기본적인 옵션을 알아두면 좋다고 생각한다 👍

728x90
반응형

'리눅스 > Command' 카테고리의 다른 글

리눅스 free 명령어  (0) 2021.12.25
리눅스 sed 명령어로 특정 문자가 포함된 라인부터 출력하기  (2) 2021.08.22
리눅스 find 명령어  (0) 2020.12.13
리눅스 uniq 명령어  (0) 2020.11.09
리눅스 sort 명령어  (2) 2020.11.04
복사했습니다!