리눅스 명령어 · 8 min read · Sep 12, 2025

리눅스 셸에서 파일 내 문자열 검색을 위한 grep 사용법

리눅스의 GREP 명령어 - 개요

리눅스의 grep 명령어는 사용자가 특정 패턴을 위해 파일이나 텍스트 스트림을 검색할 수 있게 해주는 강력한 텍스트 검색 유틸리티입니다. 이는 “ 전역 정규 표현식 출력“을 의미하며, 간단한 텍스트 문자열 및 더 복잡한 정규 표현식으로 검색하는 것을 지원합니다. 이 명령어는 종종 다른 명령어와 결합되어 출력을 필터링하고 세분화하는 데 사용됩니다. 기본적으로 grep은 패턴을 포함하는 모든 줄을 반환하지만, 대소문자 구분, 발생 횟수 세기 또는 디렉토리 내 재귀 검색과 같은 검색을 사용자 정의할 수 있는 다양한 옵션을 제공합니다. 이는 시스템 관리자, 개발자 및 유닉스와 유사한 환경에서 대량의 데이터로 작업하는 모든 사람에게 필수적인 도구입니다.

grep 명령어는 주로 지정된 단어/문자열과 일치하는 줄을 텍스트나 파일에서 검색하는 데 사용됩니다. 기본적으로 grep은 일치하는 줄을 표시하며, 하나 이상의 정규 표현식과 일치하는 텍스트 줄을 검색하는 데 사용될 수 있으며, 일치하는 줄만 출력합니다.

전제 조건

grep 명령어는 모든 리눅스 배포판의 기본 유틸리티의 일부이므로 AlmaLinux, CentOS, Debian, Linux Mint, Ubuntu, RHEL 및 RockyLinux에 기본적으로 사전 설치되어 있습니다.

기본 grep 명령어 구문

기본 grep 명령어 구문은 다음과 같습니다:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

파일에서 검색하기 위한 grep 명령어 사용법

첫 번째 예제에서는 리눅스 passwd 파일에서 사용자 “tom”을 검색할 것입니다. /etc/passwd 파일에서 사용자 “tom”을 검색하려면 다음 명령어를 입력해야 합니다:

grep tom /etc/passwd

아래는 샘플 출력입니다:

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

grep에 대소문자를 무시하도록 지시할 수 있는 옵션이 있으며, 즉, -i 옵션을 사용하여 abc, Abc, ABC 및 모든 가능한 조합과 일치하도록 할 수 있습니다. 아래와 같이:

grep -i "tom" /etc/passwd

grep의 재귀적 사용

디렉토리 계층에 여러 텍스트 파일이 있는 경우, 예를 들어 /etc/apache2/의 Apache 구성 파일에서 특정 텍스트가 정의된 파일을 찾고 싶다면, grep 명령어의 -r 옵션을 사용하여 재귀 검색을 수행할 수 있습니다. 이는 /etc/apache2/ 디렉토리 및 모든 하위 디렉토리에서 문자열 “197.167.2.9”에 대한 재귀 검색 작업을 수행합니다(아래와 같이):

grep -r "mydomain.com" /etc/apache2/

대안으로 다음 명령어를 사용할 수 있습니다:

grep -R "mydomain.com" /etc/apache2/

아래는 Nginx 서버에서 유사한 검색에 대한 샘플 출력입니다:

grep -r "mydomain.com" /etc/nginx/  
/etc/nginx/sites-available/mydomain.com.vhost:        if ($http_host != "www.mydomain.com") {

여기서 mydomain.com에 대한 결과는 해당 파일의 이름(예: /etc/nginx/sites-available/mydomain.com.vhost) 앞에 표시된 별도의 줄에서 볼 수 있습니다. 출력 데이터에서 파일 이름의 포함은 -h 옵션을 사용하여 쉽게 억제할 수 있습니다(아래 설명 참조): grep -h -R “mydomain.com” /etc/nginx/. 아래는 샘플 출력입니다:

grep -r "mydomain.com" /etc/nginx/  
if ($http_host != "www.mydomain.com") {

단어만 검색하기 위해 grep 사용

abc를 검색할 때, grep은 kbcabc, abc123, aarfbc35 등과 같은 모든 종류의 것을 일치시킵니다. 즉, 단어 경계를 준수하지 않습니다. grep 명령어를 강제로 전체 단어(abc와만 일치하는 것)를 포함하는 줄만 선택하도록 할 수 있습니다. 아래와 같이:

grep -w "abc" file.txt

예:

전체 단어만 검색하는 grep

두 개의 다른 단어 검색하기 위해 grep 사용

두 개의 다른 단어를 검색하려면 아래와 같이 egrep 명령어를 사용해야 합니다:

egrep -w 'word1|word2' /path/to/file

일치하는 단어의 줄 수 세기

grep 명령어는 -c(세기) 옵션을 사용하여 각 파일에서 특정 패턴이 일치한 횟수를 보고할 수 있는 기능이 있습니다(아래와 같이):

grep -c 'word' /path/to/file

또한 사용자는 ‘-n’ 옵션을 사용하여 각 출력 줄 앞에 해당 줄의 번호를 표시할 수 있습니다(아래와 같이):

grep -n 'root' /etc/passwd

아래는 샘플 출력입니다:

1:root:x:0:0:root:/root:/bin/bash

grep 반전 일치

사용자는 -v 옵션을 사용하여 일치를 반전시켜, 주어진 단어를 포함하지 않는 줄만 일치하도록 할 수 있습니다. 예를 들어, 다음 명령어를 사용하여 단어 par를 포함하지 않는 모든 줄을 인쇄합니다:

grep -v par /path/to/file

일치하는 파일의 이름만 나열하기

특정 단어를 언급하는 파일 이름을 나열하려면 -l 옵션을 사용해야 합니다. 예를 들어, ‘primary’라는 단어를 사용하여 다음 명령어를 실행합니다:

grep -l 'primary' *.c

마지막으로, grep에 특정 색상으로 출력을 표시하도록 강제할 수 있는 옵션이 있습니다. 다음 명령어를 사용하여:

grep --color root /etc/passwd

아래는 샘플 출력입니다:

grep 명령어로 여러 검색 패턴 처리하기

주어진 파일(또는 파일 집합)에서 여러 패턴을 검색해야 하는 상황이 있을 수 있습니다. 이러한 시나리오에서는 grep이 제공하는 ‘-e‘ 명령줄 옵션을 사용해야 합니다.

예를 들어, 현재 작업 디렉토리에 있는 모든 텍스트 파일에서 “how”, “to” 및 “forge”라는 단어를 검색하고 싶다면, 다음과 같이 할 수 있습니다:

grep -e how -e to -e forge *.txt

명령어가 작동하는 모습:

-e‘ 명령줄 옵션은 패턴이 하이픈(-)으로 시작하는 경우에도 도움이 됩니다. 예를 들어, “-how”를 검색하고 싶다면, 다음 명령어는 도움이 되지 않습니다:

grep -how *.txt

-e 명령줄 옵션을 사용하면, 명령어가 이 경우에 무엇을 검색하려고 하는지 이해합니다:

grep -e -how *.txt

두 명령어가 작동하는 모습:

grep 출력을 특정 줄 수로 제한하기

grep 출력을 특정 줄 수로 제한하고 싶다면, ‘-m‘ 명령줄 옵션을 사용하여 이를 수행할 수 있습니다. 예를 들어, testfile1.txt에서 “how”라는 단어를 검색하고 싶지만, 검색된 패턴이 포함된 3줄 이후에 grep이 검색을 중지하도록 요구하는 경우, 다음 명령어를 실행할 수 있습니다:

grep "how" -m3 testfile1.txt

명령어가 작동하는 모습:

이어서, 명령어의 매뉴얼 페이지에 다음과 같이 설명되어 있습니다:

입력이 일반 파일의 표준 입력이고, NUM 일치하는 줄이 출력되면, grep은 마지막 일치하는 줄 바로 뒤에 표준 입력이 위치하도록 보장합니다. 이것은 호출 프로세스가 검색을 재개할 수 있도록 합니다.

예를 들어, 루프가 있는 bash 스크립트가 있고, 각 루프 반복마다 하나의 일치를 가져오고 싶다면, ‘grep -m1’을 사용하면 필요한 작업을 수행할 수 있습니다.

grep이 파일에서 패턴을 가져오도록 하기

원하는 경우, grep 명령어가 파일에서 패턴을 가져오도록 할 수 있습니다. 도구의 -f 명령줄 옵션을 사용하면 됩니다.

예를 들어, 현재 디렉토리의 모든 .txt 파일에서 “how”와 “to”라는 단어를 검색하고 싶지만, 이러한 입력 문자열을 “input”이라는 파일을 통해 제공하고 싶다면, 다음과 같이 할 수 있습니다:

grep -f input *.txt

명령어가 작동하는 모습:

grep이 검색 패턴과 완전히 일치하는 줄만 표시하도록 하기

지금까지 기본적으로 grep은 검색 패턴을 포함하는 전체 줄을 일치시키고 표시하는 것을 보았습니다. 그러나 grep이 검색 패턴과 완전히 일치하는 줄만 표시하도록 하려면 ‘-x’ 명령줄 옵션을 사용하여 이를 수행할 수 있습니다.

예를 들어, testfile1.txt 파일에 다음 줄이 포함되어 있다고 가정합니다:

그리고 검색하려는 패턴은 “how are you?”입니다. grep이 이 패턴과 완전히 일치하는 줄만 표시하도록 하려면 다음과 같이 사용합니다:

grep -x "how are you?" *.txt

명령어가 작동하는 모습:

grep이 출력을 표시하지 않도록 강제하기

grep 명령어가 출력을 생성하지 않도록 해야 하는 상황이 있을 수 있습니다. 대신, 명령어의 종료 상태를 기반으로 일치 여부를 알고 싶습니다. 이는 -q 명령줄 옵션을 사용하여 달성할 수 있습니다.

-q 옵션은 출력을 음소거하지만, 도구의 종료 상태는 ‘echo $?’ 명령어로 확인할 수 있습니다. grep의 경우, 명령어는 성공적으로 일치가 발견되면 ‘0’ 상태로 종료되고, 일치가 발견되지 않으면 ‘1’ 상태로 종료됩니다.

다음 스크린샷은 성공적인 경우와 실패한 경우를 보여줍니다:

출력을 표시하지 않는 grep

grep이 검색 패턴을 포함하지 않는 파일의 이름 표시하기

기본적으로 grep 명령어는 검색 패턴을 포함하는 파일의 이름(및 일치하는 줄)을 표시합니다. 이는 이 도구에서 기대되는 것이므로 매우 논리적입니다. 그러나 검색 패턴을 포함하지 않는 파일의 이름을 얻어야 하는 경우도 있을 수 있습니다.

grep -L 옵션을 사용하면 이것도 가능합니다. 예를 들어, 현재 디렉토리에서 “how”라는 단어를 포함하지 않는 모든 텍스트 파일을 찾으려면 다음 명령어를 실행할 수 있습니다:

grep -L "how" *.txt

명령어가 작동하는 모습:

grep이 생성하는 오류 메시지 억제하기

원하는 경우 grep이 출력에서 표시하는 오류 메시지를 음소거하도록 강제할 수 있습니다. 이는 -s 명령줄 옵션을 사용하여 수행할 수 있습니다. 예를 들어, grep이 만나는 디렉토리와 관련된 오류/경고를 생성하는 다음 시나리오를 고려해 보십시오:

따라서 이러한 시나리오에서는 -s 명령줄 옵션이 도움이 됩니다. 아래를 참조하십시오.

따라서 오류/경고가 음소거된 것을 볼 수 있습니다.

grep이 디렉토리를 재귀적으로 검색하도록 하기

이전 포인트에서 사용된 예에서 알 수 있듯이, grep 명령어는 기본적으로 재귀 검색을 수행하지 않습니다. grep 검색이 재귀적이도록 하려면 -d 명령줄 옵션을 사용하고 그 값으로 ‘recurse’를 전달하십시오.

grep -d recurse "how" *

참고 1 : 이전 포인트에서 논의한 디렉토리 관련 오류/경고 메시지는 -d 옵션을 사용하여 음소거할 수도 있습니다. 단지 그 값으로 ‘skip’을 전달하면 됩니다.

참고 2 : ‘–exclude-dir=[DIR]’ 옵션을 사용하여 재귀 검색에서 패턴 DIR과 일치하는 디렉토리를 제외할 수 있습니다.

grep이 NULL 문자로 파일 이름을 종료하도록 하기

이미 논의한 바와 같이, grep의 -l 명령줄 옵션은 도구가 출력에서 파일 이름만 표시하도록 할 때 사용됩니다. 예를 들어:

이제 위의 출력에서 각 이름이 줄 바꿈 문자로 구분/종료된다는 것을 알아야 합니다. 이를 확인하는 방법은 다음과 같습니다:

출력을 파일로 리디렉션한 다음, 파일 내용을 인쇄합니다:

따라서 cat 명령어의 출력은 파일 이름 사이에 줄 바꿈 문자가 존재함을 확인합니다.

그러나 이미 알다시피, 줄 바꿈 문자는 파일 이름의 일부일 수도 있습니다. 따라서 줄 바꿈이 포함된 파일 이름을 처리하고 줄 바꿈으로 구분/종료된 경우, grep 출력을 작업하기가 어려워집니다(특히 스크립트를 통해 출력을 액세스할 때).

구분/종료 문자가 줄 바꿈이 아닌 경우가 좋습니다. 잘 알고 계시겠지만, grep은 파일 이름 뒤에 줄 바꿈이 아닌 NULL 문자가 오도록 보장하는 -Z 명령줄 옵션을 제공합니다.

따라서 우리의 경우, 명령어는 다음과 같이 됩니다:

grep -lZ "how" *.txt

NULL 문자의 존재를 확인하는 방법은 다음과 같습니다:

다음은 알아야 할 관련 명령줄 옵션입니다:

 -z, --null-data  
입력을 각 줄이 0 바이트(ASCII NUL 문자)로 종료되는 집합으로 처리합니다. 줄 바꿈 대신. -Z 또는 --null 옵션과 마찬가지로, 이 옵션은 sort -z와 같은 명령과 함께 사용하여 임의의 파일 이름을 처리할 수 있습니다.

GREP을 사용하여 로그 파일에서 오류 찾기

grep은 서비스의 오류를 디버깅할 때 리눅스 관리자의 스위스 군용 칼입니다. 대부분의 리눅스 서비스는 오류를 보고하는 로그 파일을 가지고 있습니다. 이러한 로그 파일은 방대할 수 있으며, grep은 연결 시스템의 IP 주소, 오류 문자열 또는 영향을 받는 메일 사용자의 이메일 주소를 검색하는 데 유용하고 빠른 명령입니다.

예:

특정 이메일 주소와 관련된 연결을 검색합니다. 여기서 ‘[email protected]’는 서버 mail.log 파일에 있습니다.

grep [email protected] /var/log/mail.log

결과:

Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>  
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630  
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=  
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17673>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0  
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=  
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17868>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0  
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=  
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17964>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0  
Aug 22 09:45:10 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<1.2.3.4>

이 이메일 주소에 대한 연결을 위해 로그 파일을 지속적으로 모니터링하려면, tail과 grep 명령어를 다음과 같이 결합합니다:

tail -f /var/log/mail.log | grep [email protected]

감시 기능을 종료하려면 [strg] + c 키를 누릅니다.

더 많은 GREP 명령어 예제

이 리눅스 명령어를 사용하는 더 많은 예제를 두 번째 GREP 명령어 튜토리얼에서 찾을 수 있습니다.

  • Grep을 사용하여 파일에서 패턴 검색 수행하는 방법
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.