기계적 인조 인간

리눅스에서 Grep 명령 (파일에서 텍스트 찾기)

Поиск файлов в Linux и Unix — find, grep, ack, ripgrep

Поиск файлов в Linux и Unix — find, grep, ack, ripgrep

차례:

Anonim

"전역 정규식 인쇄"를 나타내는 grep 명령은 Linux에서 가장 강력하고 일반적으로 사용되는 명령 중 하나입니다.

Grep은 주어진 패턴과 일치하는 행을 하나 이상의 입력 파일에서 검색하고 각 일치하는 행을 표준 출력에 씁니다. 파일을 지정하지 않으면 grep 은 표준 입력에서 읽습니다. 일반적으로 다른 명령의 출력입니다.

이 튜토리얼에서는 실제 예제를 통해 grep 명령을 사용하는 방법과 가장 일반적인 GNU grep 옵션에 대한 자세한 설명을 보여줍니다.

Grep 명령 구문

grep 명령을 사용하는 방법을 시작하기 전에 기본 구문을 검토하십시오.

grep 유틸리티 표현식은 다음 형식을 따릅니다.

grep PATTERN

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

  • OPTIONS -0 개 이상의 옵션. Grep은 동작을 제어하는 ​​많은 옵션을 제공합니다. PATTERN -검색 패턴. FILE -0 개 이상의 입력 파일 이름.

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

grep 을 사용하여 파일에서 문자열을 검색하는 방법

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

예를 들어, 문자열 bash 를 포함하는 /etc/passwd 파일의 행을 표시하려면 다음 명령을 사용할 수 있습니다.

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 ) 옵션을 사용하십시오.

예를 들어, 문자열 nologin 을 포함하지 않는 /etc/passwd 파일의 행을 표시하려면 다음 명령을 사용할 수 있습니다.

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 파이프 한 다음 주어진 패턴과 일치하는 행만 표시 할 수 있습니다.

예를 들어, 사용자 www-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 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

재귀 검색

패턴을 재귀 적으로 검색하려면 -r 옵션 (또는 --recursive )을 사용하십시오. 재귀 적으로 발생하는 심볼릭 링크를 건너 뛰고 지정된 디렉토리의 모든 파일을 검색합니다. 모든 기호 링크를 따르려면 -R 옵션 (또는 --dereference-recursive )을 사용하십시오.

다음 예에서는 /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.linuxize.com;

-r 대신 -R 옵션을 사용하면 grep 은 모든 기호 링크를 따릅니다.

grep -R linuxize.com /etc

출력의 마지막 줄을 확인하십시오. Nginx의 sites-enabled 디렉토리 안에있는 파일들은 sites-available 디렉토리 안에있는 설정 파일들과 심볼릭 링크되어 있기 때문에 위의 예제에서 그 줄은 인쇄되지 않습니다.

/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 출력을 억제하고 일치하는 패턴을 포함하는 파일 이름 만 인쇄하려면 -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 )을 사용하십시오.

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

grep Zebra /usr/share/words

그러나 -i 옵션을 사용하여 대소 문자를 구분하지 않는 검색을 수행하면 대문자와 소문자가 모두 일치합니다.

grep -i Zebra /usr/share/words

"Zebra"를 지정하면 "zebra", "ZEbrA"또는 해당 문자열에 대한 대소 문자의 다른 조합과 일치합니다.

zebra zebra's zebras

전체 단어 검색

"gnu"를 검색 할 때 grep 은 "cynus"또는 "magnum"과 같이 더 큰 단어로 "gnu"가 포함 된 행도 인쇄합니다.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

지정된 문자열이 전체 단어 (단어가 아닌 문자로 --word-regexp ) 인 --word-regexp 하려면 -w (또는 --word-regexp ) 옵션을 사용하십시오.

단어 문자에는 영숫자 문자 ( az , AZ 0-9 )와 밑줄 ( _ )이 포함됩니다. 다른 모든 문자는 단어가 아닌 문자로 간주됩니다.

grep -w gnu /usr/share/words

gnu

줄 번호 표시

패턴과 일치하는 문자열을 포함하는 행 수를 표시하려면 -n (또는 --line-number ) 옵션을 사용하십시오. 이 옵션을 사용하면 grep 은 찾은 줄 번호가 앞에 붙은 표준 출력에 일치하는 항목을 인쇄합니다.

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

grep -n 10000 /etc/services

아래 출력은 10423 및 10424 행에서 일치하는 항목이 있음을 보여줍니다.

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

개수 일치

일치하는 행 수를 표준 출력에 인쇄하려면 -c (또는 --count ) 옵션을 사용하십시오.

아래 예에서는 /usr/bin/zsh 를 셸로 사용하는 계정 수를 계산합니다.

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

4

여러 문자열 검색 (패턴)

OR 연산자를 사용하여 둘 이상의 검색 패턴을 결합 할 수 있습니다..

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

아래 예에서는 Nginx 로그 오류 파일에서 fatal , error critical 단어를 모두 검색합니다.

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

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

저소음 모드

-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의 두 가지 정규 표현식 기능 세트가 있습니다. 기본적으로 grep 은 패턴을 기본 정규식으로 해석합니다.

기본 정규식 모드에서 사용될 때 메타 문자를 제외한 다른 모든 문자는 실제로는 자신과 일치하는 정규식입니다. 다음은 가장 일반적으로 사용되는 메타 문자 목록입니다.

  • ^ (캐럿) 기호를 사용하여 행 시작 부분의 표현식을 일치 시키십시오. 다음 예제에서 ^kangaroo 문자열은 줄의 맨 처음에 나타나는 경우에만 일치합니다.

    grep "^kangaroo" file.txt

    $ (달러) 기호를 사용하여 행 끝에 표현식을 일치 시키십시오. 다음 예에서 문자열 kangaroo$ 는 줄의 끝에서 발생하는 경우에만 일치합니다.

    grep "kangaroo$" file.txt

    를 사용하십시오 . 단일 문자와 일치하는 (마침표) 기호 예를 들어, kan 시작하고 두 개의 문자가 있고 문자열 roo 끝나는 것을 일치 시키려면 다음 패턴을 사용할 수 있습니다.

    grep "kan..roo" file.txt

    사용하다 대괄호로 묶인 단일 문자와 일치합니다. 예를 들어 accept 또는“ accent 를 포함하는 행을 찾으면 다음 패턴을 사용할 수 있습니다.

    grep "accet" file.txt

    사용하다 대괄호로 묶인 단일 문자와 일치합니다. 다음 패턴은 coca , cobalt 등과 같이 co(any_letter_except_l)a 포함하는 문자열 조합과 일치하지만 cola 포함하는 행과는 일치하지 않습니다.

    grep "coa" file.txt

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

확장 정규 표현식

패턴을 확장 정규식으로 해석하려면 -E (또는 --extended-regexp ) 옵션을 사용하십시오. 확장 정규식에는 모든 기본 메타 문자와 추가 메타 문자가 포함되어보다 복잡하고 강력한 검색 패턴을 만듭니다. 다음은 몇 가지 예입니다.

  • 주어진 파일에서 모든 이메일 주소를 일치시키고 추출하십시오.

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    주어진 파일에서 유효한 모든 IP 주소를 일치시키고 추출하십시오.

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

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

경기 전 라인 인쇄

줄을 일치시키기 전에 특정 줄 수를 인쇄하려면 -B (또는 --before-context ) 옵션을 사용하십시오.

예를 들어, 행을 일치시키기 전에 5 행의 선행 컨텍스트를 표시하려면 다음 명령을 사용하십시오.

grep -B 5 root /etc/passwd

경기 후 라인 인쇄

줄을 일치시킨 후 특정 줄 수를 인쇄하려면 -A (또는 --after-context ) 옵션을 사용하십시오.

예를 들어 줄을 일치시킨 후 후행 컨텍스트의 다섯 줄을 표시하려면 다음 명령을 사용합니다.

grep -A 5 root /etc/passwd

결론

grep 명령을 사용하면 파일 내부에서 패턴을 검색 할 수 있습니다. 일치하는 경우 grep은 지정된 패턴을 포함하는 행을 인쇄합니다.

Grep 사용자 매뉴얼 페이지에서 Grep에 대해 더 많은 정보를 얻을 수 있습니다.

grep 터미널