Linux에서 GREP이란 무엇이며 어떻게 사용하는가

노트북으로 작업하는 사람의 사진.

Grep은 일치하는 패턴을 찾기 위한 작은 UNIX 프로그램입니다. V6 UNIX에서 처음 출시된 후, 현재는 Linux, macOS, 심지어 BSD와 같은 거의 모든 UNIX 유사 시스템에서 찾을 수 있습니다. 이 기사에서는 Grep의 기본 사항을 살펴보고 일상 작업에서 프로그램을 사용하는 몇 가지 예를 보여드리겠습니다.

Grep 사용의 기본

Grep은 기본적으로 간단하고 직관적인 프로그램입니다. 입력을 받아 원하는 텍스트를 찾아 일치하는 결과를 출력으로 인쇄합니다. Grep은 거의 모든 일반 텍스트 소스를 처리할 수 있습니다. 이를 통해 다른 명령에서 오는 입력을 읽고 파일을 직접 살펴볼 수 있습니다.

Grep을 시작하는 가장 간단한 방법은 텍스트 파일에서 데이터를 읽는 것입니다. 예를 들어, 다음 명령은 my sample.txt 파일의 내용을 인쇄합니다:

grep'' sample.txt

또한, 이 기능을 사용하여 텍스트 파일 내에서 특정 텍스트를 검색하고 찾을 수 있습니다:

grep'word' sample.txt

Grep의 간단한 단어 일치 기능을 보여주는 터미널.

Grep을 UNIX 파이프와 함께 사용하여 여러 프로그램을 하나의 명령으로 연결할 수도 있습니다:

cat sample.txt |grep''

아무런 인수 없이 실행될 때 전체 파일을 인쇄하는 Grep를 보여주는 터미널.

알아두세요: UNIX 지식을 확장하고 싶으신가요? GNU less의 치트시트를 통해 Linux에서 화면 페이저가 작동하는 방법을 배워보세요.

디렉터리에서 파일 찾기

Grep으로 수행할 수 있는 가장 쉬운 작업 중 하나는 디렉터리 목록에서 파일을 찾는 것입니다. 이렇게 하려면 ls 명령의 출력을 UNIX 파이프를 통해 Grep으로 직접 보낼 수 있습니다.

다음 명령은 다운로드 폴더의 모든 .jpg 파일을 인쇄하고 강조합니다:

ls ~/Downloads |grep \\.jpg

파일 확장자를 기반으로 파일 목록을 필터링하는 Grep를 보여주는 터미널.

더욱 정교한 ls 출력을 Grep에 보내 패턴 일치를 사용할 수도 있습니다. 예를 들어, 다음은 파일 크기가 1MB 미만인 디렉터리 내 모든 파일을 나열합니다:

ls-lh ./|grep .K

대소문자 무시

기본적으로 UNIX 유사 시스템의 거의 모든 프로그램은 대소문자를 구분합니다. 즉, 시스템은 “Hello”를 “hello”, “hEllo”, “helLo”와 다르게 처리합니다.

Grep의 기본 대소문자 구분 동작을 보여주는 터미널.

이 동작은 파일 내에서 문자열을 찾을 때 귀찮을 수 있습니다. 예를 들어, 에세이에는 “Hello”와 “hello”가 동시에 있을 수 있습니다. 이를 해결하기 위해, 찾고자 하는 문자열 뒤에 -i 플래그를 사용하여 Grep을 실행합니다.

grep-i Hello hello.txt

Grep의 대소문자 구분을 비활성화하는 -i 플래그를 보여주는 터미널.

재귀 검색

Grep은 한 번에 두 개 이상의 파일이나 디렉터리를 검색할 수 있습니다. 이는 여러 파일로 작업하는 프로젝트에서 텍스트 문자열이 디렉터리 내에서 어디에 나타나는지 알고 싶을 때 유용합니다. 예를 들어, 다음 명령은 “sample” 디렉터리 내에서 “MakeTechEasier”라는 단어를 일치시킵니다:

grep-r'MakeTechEasier' ./sample

즉, -r 플래그를 사용하면 Grep은 대상 디렉터리의 모든 파일을 살펴보도록 지시하게 됩니다. 이는 검색하는 폴더 내에 비텍스트 파일이 있는 경우 문제가 될 수 있습니다. 이를 방지하기 위해, -I 플래그와 함께 Grep을 실행합니다:

grep-rI'MakeTechEasier' ./sample

참고: 터미널에서 touch 명령을 사용하여 파일을 생성하는 방법을 배워보세요.

문자열이 포함된 파일 일치

특정 문자열이 여러 파일에서 어떻게 발생하는지를 보여주는 것 외에도, Grep을 사용하여 대상 텍스트가 포함된 파일 목록을 만들 수 있습니다. 이는 파일에 특정 문자열이 포함되어 있는지 알고 싶지만 Grep이 터미널에서 모든 인스턴스를 인쇄하지 않기를 원할 때 유용합니다.

이렇게 하려면, 원하는 문자열과 살펴보려는 디렉터리를 따르는 -r-l 플래그를 사용하여 Grep을 실행합니다:

grep-rl MakeTechEasier ./sample

Grep 명령을 Bash 서브쉘에 포함시켜 텍스트 일치에 대한 여러 조건을 만들 수도 있습니다. 예를 들어, 다음 코드는 “sample” 폴더에서 “Hello”와 “MakeTechEasier”를 모두 포함하는 파일만 반환합니다:

grep-rl MakeTechEasier $(grep-rl Hello ./sample)

반대 찾기

직접 검색하는 것 외에도, Grep은 초기 기준과 일치하지 않는 결과를 반환할 수 있습니다. 처음에는 직관적이지 않을 수 있지만, 텍스트 입력에서 오류와 이상을 강조해야 할 경우 도움이 될 수 있습니다.

이렇게 하려면, 원하시는 다른 플래그와 함께 -v를 사용하여 Grep을 실행합니다. 예를 들어, 다음은 “/etc/nginx” 폴더 내 모든 파일을 재귀적으로 검색하고 “nginx”란 문자열이 포함되지 않은 모든 행을 반환합니다:

grep-rv'nginx'/etc/nginx

대상 문자열을 제외한 모든 것을 일치시키는 Grep의 반전 플래그를 보여주는 터미널.

단어와 행

Grep이 특정 패턴을 포함하는 모든 것이 아니라 전체 단어나 행을 검색하도록 지시하는 것도 유용할 수 있습니다. 이는 많은 단어에서 공통적으로 나타나는 문자열을 일치시키는 경우 유용합니다. 예를 들어, “it”라는 단어를 일치시키면 “it”이 많은 단어에서 발견되기 때문에 많은 거짓 긍정 결과를 반환하게 됩니다.

이를 해결하기 위해, 찾고자 하는 단어 뒤에 -w 플래그를 사용하여 Grep을 실행할 수 있습니다:

cat it.txt |grep-w it

Grep의 전체 단어 일치 플래그를 보여주는 터미널.

패턴을 포함하는 모든 단어를 인쇄하는 대신, Grep은 그 단어만 인쇄합니다. Grep은 전체 행에 대해서도 -x 플래그를 사용하여 동일한 기능을 수행하므로, 구성 파일에서 구문이나 단일 행을 찾고 있는 경우 실제로 도움이 될 수 있습니다.

Grep 출력에 행 번호 추가하기

행 번호는 프로그램을 디버깅하고 텍스트를 교정하는 데 중요한 부분입니다. 특정 함수나 문장의 위치를 정확하게 참조할 수 있어 수정과 수정이 훨씬 더 빠릅니다.

이러한 점에서 Grep은 기본 출력에 행 번호를 인쇄하는 기능을 가지고 있습니다. 이를 위해, 찾고자 하는 문자열 뒤에 -n 플래그를 사용하여 프로그램을 실행합니다:

grep-n main ./my-code.c

UNIX 파이프를 사용하면 Grep의 출력을 수정하고 내가 찾고 있는 항목의 행 번호만 인쇄할 수도 있습니다. 이렇게 하면 큰 텍스트를 분석하기가 훨씬 더 깔끔하고 간편해집니다:

grep-n Sed essay.txt |cut-f1-d :

참고: UNIX 파이프는 Grep의 도구 그 이상입니다. SSH 파이프를 만들어 원격 셸 작업을 자동화하는 방법을 배워보세요.

Grep과 함께 확장된 정규 표현식 사용하기

Grep은 텍스트 문자열을 일치시키고 필터링하기 위해 기본 정규 표현식(BRE) 메타문자 집합을 사용합니다. 이는 대부분의 작업에 대해 유용하지만, 일부 사용자는 패턴 그룹 작업 시 제한적일 수 있습니다.

이를 해결하기 위해, 대부분의 Grep 구현에서는 -E 플래그를 제공하여 프로그램이 확장된 정규 표현식(ERE) 메타문자를 구문 분석하도록 허용합니다. 예를 들어, 다음 명령은 -E 플래그와 함께만 작동합니다:

printf"hello\nhellooooo\n"|grep-E .*o{2}$

참고: GNU 버전의 Grep은 기본적으로 일부 ERE 기능을 사용합니다. 그러나 ERE를 사용할 때는 호환성을 유지하기 위해 항상 -E를 사용하는 것이 좋습니다.

추가로, Grep에는 모든 정규 표현식 기능을 제거하는 특별한 모드도 있습니다. 이를 사용하려면, 프로그램을 -F 플래그와 함께 사용하여 일반 문자열을 입력합니다:

grep-F[MakeTechEasier] ./fixed.txt

Grep 출력에 인접한 행 추가하기

Grep의 핵심 장점 중 하나는 텍스트가 파일이나 입력 스트림에 어디에 나타나는지를 보여주는 것입니다. 그러나 문자열의 정확한 위치를 아는 것만으로는 문제가 해결되지 않는 경우가 있습니다. 예를 들어, 충돌 로그는 전통적인 “Segmentation Fault” 메시지를 인쇄하기 전에 추가적인 컨텍스트를 제공하는 경우가 많습니다.

이러한 문제를 해결하는 한 가지 방법은 Grep을 실행할 때 -C 플래그를 사용하여 원하는 대상 텍스트 주위에 인쇄하고 싶은 행 수를 지정하는 것입니다. 다음 명령은 텍스트 일치 전후로 다섯 줄을 인쇄합니다:

grep-C5'Hello' ./hello-sample.txt

대상 문자열의 주변 문맥을 인쇄하는 Grep의 능력을 보여주는 터미널.

Grep이 일치하기 전 또는 후의 문맥만 인쇄할지 여부를 -B-A 플래그로 사용자 지정할 수도 있습니다. 예를 들어, 다음은 대상 문자열 이후의 이전 10줄만 인쇄합니다:

grep-A10'Hello' ./hello-sample.txt

Grep이 처음 문자열 일치 이후의 다음 10줄을 인쇄하는 모습을 보여주는 터미널.

Grep의 기본 사항과 일상 작업에서 사용하는 방법을 배웠으므로, 이제 명령 줄 및 핵심 UNIX 유틸리티를 이해하는 첫 단계를 내딛을 수 있습니다. Linux에서 sed가 작동하는 방법을 배우며 이 다양하고 깊은 세계를 더 탐험해보세요.

이미지 출처: Alejandro Escamilla via Unsplash. 모든 수정 및 스크린샷은 Ramces Red에 의해 수행되었습니다.