SW/리눅스

Linux : Grep 명령어 사용하는 방법, 예제, 명령어 (파일들의 내용 찾는 방법)

얇은생각 2021. 2. 18. 07:30
반응형

grep 명령은 "global regular expression print"를 의미하며 Linux에서 가장 강력하고 일반적으로 사용되는 명령 중 하나입니다. 

grep은 하나 이상의 입력 파일에서 지정된 패턴과 일치하는 줄을 검색하고 각 일치 줄을 표준 출력에 씁니다. 파일이 지정되지 않은 경우 표준 입력에서 grep를 읽습니다.

이 문서에서는 가장 일반적인 GNU grep 옵션에 대한 실제 예와 자세한 설명을 통해 grep 명령을 사용하는 방법을 보여드리겠습니다.

 

 

Linux : Grep 명령어 사용하는 방법, 예제, 명령어 (파일들의 내용 찾는 방법)

 

 

grep 명령 구문

grep 명령의 구문은 다음과 같습니다.

grep [OPTIONS] PATTERN [FILE...]

 

 

대괄호의 항목은 선택 사항입니다.

 

OPTIONS - 0개 이상의 옵션을 선택합니다. Grep에는 동작을 제어하는 여러 옵션이 포함되어 있습니다.

PATTERN - 패턴을 검색합니다.

FILE - 입력 파일 이름을 0개 이상 입력합니다.

 

파일을 검색하려면 명령을 실행하는 사용자에게 파일에 대한 읽기 권한이 있어야 합니다.

 

 

 

파일 문자열 검색

grep 명령의 가장 기본적인 용도는 파일에서 문자열(텍스트)을 검색하는 것입니다. 

예를 들어 /etc/passwd 파일의 문자열 bash가 포함된 모든 줄을 표시하려면 다음 명령을 실행합니다.

grep bash /etc/passwd

# root:x:0:0:root:/root:/bin/bash
# linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

 

 

문자열에 공백이 포함되어 있는 경우 문자열에 작은따옴표나 큰따옴표로 묶어야 합니다.

grep "Gnome Display Manager" /etc/passwd

 

 

 

 

일치 항목을 반전 (제외)

패턴과 일치하지 않는 선을 표시하려면 -v(또는 --invert-match) 옵션을 사용합니다. 

예를 들어 문자열 nlogin이 들어 있지 않은 줄을 출력하려면 다음을 수행합니다.

grep -v nologin /etc/passwd

# root:x:0:0:root:/root:/bin/bash
# colord:x:124:124::/var/lib/colord:/bin/false
# git:x:994:994:git daemon user:/:/usr/bin/git-shell
# linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

 

 

 

 

Grep를 사용하여 명령 출력 필터링

명령의 출력은 grep through pipe로 필터링할 수 있으며, 지정된 패턴과 일치하는 라인만 터미널에 출력됩니다.

예를 들어 사용자 ww-data로 시스템에서 실행 중인 프로세스를 확인하려면 다음 ps 명령을 사용할 수 있습니다.

ps -ef | grep www-data

# www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
# root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
# www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
# www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

 

 

 

명령에 따라 여러 파이프를 연결할 수도 있습니다. 위의 출력에서 볼 수 있듯이 grep 프로세스를 포함하는 선도 있습니다. 해당 라인을 표시하지 않으려면 아래와 같이 출력을 다른 grep 인스턴스로 전달합니다.

ps -ef | grep www-data | grep -v grep

# www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
# www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
# www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

 

 

 

재귀 검색

패턴을 반복적으로 검색하려면 -r 옵션(또는 --recurative)을 사용하여 grep를 호출합니다. 이 옵션을 사용하면 grep이 지정된 디렉터리의 모든 파일을 검색하여 반복적으로 발생하는 symlink를 건너뜁니다.

-r 대신 모든 심볼 링크를 따라가려면 -R 옵션(또는 --reference-recurative)을 사용합니다.

다음은 /etc 디렉토리 내의 모든 파일에서 linuxize.com 문자열을 검색하는 방법을 보여 주는 예제입니다.

grep -r linuxize.com /etc

# /etc/hosts:127.0.0.1 node2.linuxize.com
# /etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.lin

 

 

-R 옵션을 사용하는 경우 grep는 모든 심볼 링크를 따릅니다.

grep -R linuxize.com /etc

# /etc/hosts:127.0.0.1 node2.linuxize.com
# /etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;
# /etc/nginx/sites-enabled/linuxize.com:    server_name linuxize.com   www.linuxize.com;

 

 

아래 출력의 마지막 줄에 주목하십시오. grep가 -r로 호출될 때 이 줄은 출력되지 않습니다. Nginx의 사이트 지원 디렉터리 내의 파일은 사이트 사용 가능한 디렉터리 내의 구성 파일에 대한 symlink이기 때문입니다.

 

 

 

파일 이름만 표시

기본 grep 출력을 표시하지 않고 일치하는 패턴을 포함하는 파일 이름만 출력하려면 -l(또는 --files with matches) 옵션을 사용합니다.

아래 명령은 현재 작업 디렉터리에서 .conf로 끝나는 모든 파일을 검색하고 linuxize.com 문자열을 포함하는 파일 이름만 출력합니다.

grep -l linuxize.com *.conf

# tmux.conf
# haproxy.conf

 

 

-l 옵션은 일반적으로 재귀 옵션 -R:와 함께 사용됩니다.

grep -Rl linuxize.com /tmp

 

 

 

대/소문자를 구분하지 않는 검색

기본적으로 grep은 대소문자를 구분합니다. 즉, 대문자 및 소문자는 별개의 문자로 처리됩니다.

검색할 때 대/소문자를 무시하려면 -i 옵션(또는 --ignore-case)을 사용하여 grep를 호출합니다.

예를 들어, 옵션 없이 Zebra를 검색할 때 다음 명령어는 일치하는 선이 있는 출력을 표시하지 않습니다.

grep Zebra /usr/share/words

 

 

그러나 -i 옵션을 사용하여 대소문자를 구분하지 않는 검색을 수행할 경우 대소문자를 구분합니다.

grep -i Zebra /usr/share/words

# zebra
# zebra's
# zebras

 

 

 

전체 단어 검색

문자열을 검색할 때 grep은 문자열이 더 큰 문자열에 포함된 모든 줄을 표시합니다. 

예를 들어 "gnu"를 검색하면 "gnu"가 "cygnus" 또는 "magnum"과 같이 큰 단어에 포함된 모든 행이 일치합니다.

grep gnu /usr/share/words

# cygnus
# gnu
# interregnum
# lgnu9d
# lignum
# magnum
# magnuson
# sphagnum
# wingnut

 

 

지정된 문자열이 전체 단어(단어가 아닌 문자로 포함됨)인 줄만 반환하려면 -w(또는 --word-regexp) 옵션을 사용합니다. 

단어 문자에는 영숫자(a-z, A-Z 및 0-9)와 밑줄(_)이 포함됩니다. 다른 모든 문자는 비단어 문자로 간주됩니다.

-w 옵션을 포함하여 위와 동일한 명령을 실행하는 경우 grep 명령은 gnu가 별도의 단어로 포함된 행만 반환합니다.

grep -w gnu /usr/share/words

# gnu

 

 

 

라인 번호 표시

-n(또는 --line-number) 옵션은 grep에 패턴과 일치하는 문자열을 포함하는 선의 라인 번호를 표시하도록 지시합니다. 이 옵션을 사용할 경우 grep은 일치 항목을 라인 번호가 앞에 붙은 표준 출력합니다.

예를 들어 일치하는 줄 번호로 접두사를 붙인 문자열 bash가 포함된 /etc/services 파일의 줄을 표시하려면 다음 명령을 사용할 수 있습니다.

grep -n 10000 /etc/services

# 10423:ndmp            10000/tcp
# 10424:ndmp            10000/udp

 

 

 

일치 항목 개수

표준 출력에 일치하는 라인 수를 출력하려면 -c(또는 --count) 옵션을 사용합니다. 

아래 예에서는 셸로 /usr/bin/zsh가 있는 계정의 수를 계산합니다.

regular expression
grep -c '/usr/bin/zsh' /etc/passwd

# 4

 

 

 

Quiet 모드

-q(또는 --quiet)는 grep이 표준 출력에 아무것도 표시하지 않도록 조용한 모드로 실행하도록 지시합니다. 일치하는 항목이 있으면 명령이 종료되고 상태는 0입니다. 이 기능은 파일에 문자열이 포함되어 있는지 확인하고 결과에 따라 특정 작업을 수행하려는 셸 스크립트에서 grep를 사용할 때 유용합니다. 

다음은 if 문의 테스트 명령으로 조용한 모드에서 grep를 사용하는 예입니다.

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

 

 

 

기본 정규식

GNU Grep에는 Basic, Extended 및 Perl 호환이라는 세 가지 정규 표현식 기능 세트가 있습니다.

기본적으로 grep은 패턴을 메타 문자를 제외한 모든 문자가 실제로 일치하는 정규식인 기본 정규식으로 해석합니다.

다음은 가장 일반적으로 사용되는 메타 문자의 목록입니다.

^(carett) 기호를 사용하여 줄의 시작 부분에서 식과 일치시킵니다. 다음 예에서, 줄 캥거루는 줄의 맨 처음에 발생할 때만 일치합니다.

grep "^kangaroo" file.txt

 

 

$(달러) 기호를 사용하여 줄의 끝에 있는 식과 일치시킵니다. 다음 예제에서, 줄 캥거루는 줄의 맨 끝에 있는 경우에만 일치합니다.

grep "kangaroo$" file.txt

 

 

.(주기) 기호를 사용하여 단일 문자를 일치시킵니다. 예를 들어, 칸으로 시작하고 문자열 루우로 끝나는 문자를 일치시키기 위해 다음 패턴을 사용할 수 있습니다.

grep "kan..roo" file.txt

 

 

[ ](브래킷)를 사용하여 괄호 안에 있는 단일 문자를 일치시킵니다. 예를 들어, "accent" 또는 "accent"가 들어 있는 줄을 찾으십시오. 다음 패턴을 사용할 수 있습니다.

grep "acce[np]t" file.txt

 

 

 

[^]를 사용하여 괄호 안에 들어 있지 않은 단일 문자를 일치시킵니다. 다음 패턴은 코카, 코발트 등과 같이 co(any_letter_except_l)a를 포함하는 문자열의 조합과 일치하지만 콜라를 포함하는 라인은 일치하지 않습니다.

grep "co[^l]a" file.txt

 

 

다음 문자의 특수 의미를 피하려면 \(백슬래시) 기호를 사용하십시오.

 

 

 

확장 정규식

패턴을 확장 정규식으로 해석하려면 -E(또는 --확장-regxp) 옵션을 사용합니다. 확장 정규식에는 기본 메타 문자와 함께 더 복잡하고 강력한 검색 패턴을 만드는 추가 메타 문자가 포함됩니다. 다음은 몇 가지 예입니다.

지정된 파일에서 모든 전자 메일 주소를 일치시키고 압축을 풉니다. 

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt

 

 

 

지정된 파일에서 모든 유효한 IP 주소를 일치시키고 압축을 풉니다.

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

 

 

-o 옵션은 일치하는 문자열만 출력하는 데 사용됩니다.

 

 

 

여러 문자열(패턴) 검색

OR 연산자 |를 사용하여 두 개 이상의 검색 패턴을 조인할 수 있습니다. 

기본적으로 grep은 패턴을 특별한 의미를 잃고 백슬래시 버전을 사용해야 하는 메타문자의 기본적인 정규식으로 해석합니다.

아래 예에서는 Nginx 로그 오류 파일에서 치명적, 오류 및 중요 단어의 모든 항목을 검색합니다.

grep 'fatal\|error\|critical' /var/log/nginx/error.log

 

 

확장 정규식 옵션 -E를 사용하는 경우 아래와 같이 연산자 |를 이스케이프하면 안 됩니다.

grep -E 'fatal|error|critical' /var/log/nginx/error.log

 

 

 

일치하기 전에 라인 출력

선과 일치하기 전에 특정 개수의 선을 출력하려면 -B(또는 --before-context) 옵션을 사용합니다.

예를 들어, 선과 일치하기 전에 선행 컨텍스트의 다섯 줄을 표시하려면 다음 명령을 사용합니다.

grep -B 5 root /etc/passwd

 

 

 

일치 후 라인 출력

일치하는 줄 뒤에 특정 개수의 줄을 출력하려면 -A(또는 --after-context) 옵션을 사용합니다.

예를 들어, 일치하는 선 뒤에 5개의 후행 컨텍스트를 표시하려면 다음 명령을 사용합니다.

grep -A 5 root /etc/passwd

 

반응형