실생활에서 도움이 되는 16가지 grep 명령 예제

게시 됨: 2021-02-23

원래 Unix 기반 시스템용으로 개발된 grep은 Linux 상자에서 가장 널리 사용되는 명령줄 유틸리티 중 하나입니다.

그 이름은 ed 도구의 또 다른 유사한 명령, 즉 g/re/p에서 온 것입니다. g / re / p 는 정규식에 대한 전역 검색과 일치하는 줄 인쇄를 나타냅니다. grep은 기본적으로 표준 입력 또는 파일에서 주어진 패턴 또는 정규식을 검색하고 주어진 기준과 일치하는 행을 인쇄합니다. 큰 로그 파일에서 필요한 정보만 인쇄하면서 불필요한 세부 정보를 필터링하는 데 자주 사용됩니다.

정규식의 강력한 기능과 grep에서 지원되는 옵션이 결합되어 이를 가능하게 합니다.

여기서는 시스템 관리자 또는 개발자가 다양한 시나리오에서 일반적으로 사용하는 grep 명령 중 일부를 다룰 것입니다.

그럼 시작하겠습니다…

grep 명령 구문

grep 명령은 파이핑 없이 사용되는 경우 파일 목록과 함께 패턴 및 선택적 인수를 예상합니다.

 $ grep [options] pattern [files]

간단한 예는 다음과 같습니다.

 $ grep my file.txt my_file $

여러 파일 검색

grep을 사용하면 하나가 아닌 여러 파일에서 지정된 패턴을 검색할 수 있습니다. * 와일드카드를 사용하여 여러 파일에서 패턴을 찾는 방법은 다음과 같습니다.

 $ sudo grep -i err /var/log/messages*

산출:

 $ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $

grep 이 주어진 패턴을 찾은 위치를 나타내기 위해 일치하는 줄을 인쇄하기 전에 파일 이름이 먼저 인쇄되는 것을 위의 출력에서 ​​관찰할 수 있습니다.

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

grep은 패턴의 대소문자를 보지 않고 패턴을 검색하도록 제안합니다. -i 플래그를 사용하여 대소문자를 무시하도록 grep에 지시합니다.

 $ grep -i [pattern] [file]

산출:

 $ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

전체 단어 검색

항상 부분 일치를 원하는 것은 아니지만 grep이 완전한 단어만 일치시키기를 기대합니다. -w 플래그로 그렇게 할 수 있습니다.

 $ grep -w [pattern] [file]

산출:

 $ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $

일치 횟수 확인

때로는 실제 일치하는 줄 대신 grep이 성공적으로 일치시킨 횟수만 필요합니다. -c 옵션을 사용하여 이 개수를 얻을 수 있습니다.

 $ grep -c [pattern] [file]

산출:

 $ grep -c is text_file.txt 2 $

하위 디렉토리 검색

현재 작업 디렉토리뿐만 아니라 하위 디렉토리에서도 파일을 검색해야 하는 경우가 많습니다. grep을 사용하면 -r 플래그를 사용하여 쉽게 수행할 수 있습니다.

 $ grep -r [pattern] *

산출:

 $ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $

보시다시피 grep은 현재 디렉토리 내의 각 하위 디렉토리를 순회하고 일치하는 항목이 있는 파일과 행을 나열합니다.

역 검색

주어진 패턴과 일치하지 않는 항목을 찾으려면 grep에서 -v 플래그를 사용하여 해당 작업을 수행할 수 있습니다.

 $ grep -v [pattern] [file]

산출:

 $ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

-v 플래그를 사용하거나 사용하지 않고 동일한 패턴 및 파일에서 grep 명령의 출력을 비교할 수 있습니다. -v 를 사용하면 패턴과 일치하지 않는 줄이 인쇄됩니다.

줄 번호 인쇄

grep을 사용하면 인쇄된 줄과 함께 줄 번호를 인쇄할 수 있으므로 파일에서 줄의 위치를 ​​쉽게 알 수 있습니다. 출력에서 줄 번호를 얻으려면 표시된 대로 -n 옵션을 사용하십시오.

 $ grep -n [pattern] [file]

산출:

 $ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $

grep 출력 제한

로그 등과 같은 큰 파일의 경우 grep 출력이 길 수 있으며 모든 것을 일치시키는 대신 출력에 고정된 수의 라인이 필요할 수 있습니다. – m[num] 을 사용하여 인쇄된 줄을 숫자로 제한할 수 있습니다. 사용 방법은 다음과 같습니다.

 $ grep -m[num] [pattern] [file]

아래 예에서 동일한 조건 세트에 대해 -m 플래그 사용이 grep 출력에 어떤 영향을 미치는지 확인하십시오.

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $

추가 라인 표시

종종 일치하는 패턴이 있는 행뿐만 아니라 더 나은 컨텍스트를 위해 그 위 또는 아래에 일부 행이 필요합니다.

num 값과 함께 -A , -B 또는 -C 플래그를 사용하여 grep을 사용하여 패턴이 있는 줄의 위나 아래(또는 둘 다)를 인쇄할 수 있습니다. 여기서 num 은 일치하는 줄 바로 위 또는 아래에 인쇄할 추가 줄 수를 나타냅니다. 이는 지정된 파일 또는 파일 목록에서 grep이 찾은 모든 일치 항목에 적용됩니다.

 $ grep -A[num] [pattern] [file]

또는

 $ grep -B[num] [pattern] [file]

또는

 $ grep -C[num] [pattern] [file]

아래 출력은 일반 grep 출력과 -A , -B-C 플래그가 하나씩 있는 출력을 보여줍니다. grep이 플래그와 해당 값 및 각 출력의 변경 사항을 어떻게 해석하는지 확인하십시오. -A1 플래그를 사용하면 grep은 일치하는 줄 바로 뒤에 오는 1줄을 인쇄합니다.

마찬가지로 -B1 플래그를 사용하면 일치하는 줄 바로 앞에 한 줄을 인쇄합니다. -C1 플래그를 사용하면 일치하는 줄 앞뒤에 있는 1줄을 인쇄합니다.

 $ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

파일 이름 나열

실제로 일치하는 줄 대신 패턴이 발견된 파일의 이름만 인쇄하려면 -l 플래그를 사용하십시오.

 $ grep -l [pattern] [file]

다음은 실행 예입니다.

 $ grep -l su *.txt file.txt text_file.txt $

정확한 줄 인쇄

때로는 패턴의 일부가 아니라 주어진 패턴과 정확히 일치하는 줄을 인쇄해야 합니다. grep은 -x 플래그를 허용합니다.

 $ grep -x [pattern] [file]

아래 예에서 file.txt에는 "support"라는 단어가 한 줄만 포함되어 있으므로 다른 텍스트와 함께 "support"라는 단어가 포함될 수 있는 줄은 무시하면서 -x 플래그가 포함된 grep에 의해 일치됩니다.

 $ grep -x support *.txt file.txt:support $

시작 문자열 일치

정규식을 사용하면 줄 시작 부분에서 문자열을 찾을 수 있습니다. 방법은 다음과 같습니다.

 $ grep [options] "^[string]" [file]

예시:

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $

^ 문자를 사용하여 출력이 어떻게 변경되는지 관찰하십시오. ^ 는 문자열의 시작을 나타내며 grep은 ^It It 단어로 시작하는 줄과 일치합니다. 패턴에 공백 등이 포함된 경우 따옴표로 묶으면 도움이 됩니다.

종료 문자열 일치

또 다른 일반적인 유용한 정규식은 라인 패턴의 끝을 일치시키는 것입니다.

 $ grep [options] "[string]$" [file]

예시:

 $ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $

우리는 . 줄 끝에 있는 문자. 마침표(.)는 특수한 의미 문자이므로 \ 문자로 이스케이프 처리해야 합니다. 우리가 단지 . 문자 및 $ 를 사용하여 grep에 . (중간에 그것을 포함할 수 있는 것이 아님).

패턴 파일 사용

자주 사용하는 복잡한 패턴 목록이 있는 상황이 있을 수 있습니다. 매번 기록하는 대신 파일에 패턴 목록을 지정하고 -f 플래그와 함께 사용할 수 있습니다. 파일은 라인당 하나의 패턴을 포함해야 합니다.

 $ grep -f [pattern_file] [file_to_match]

이 예에서는 아래 내용으로 패턴 파일 이름 pattern.txt 를 만들었습니다.

 $ cat pattern.txt This It $

이를 사용하려면 -f 플래그를 사용하십시오.

 $ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

여러 패턴 지정

grep은 -e 플래그를 사용하여 여러 패턴을 지정할 수 있습니다.

 $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]

예시:

 $ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

확장된 RegEx 지정

grep은 확장 정규식 또는 -E 플래그를 사용하는 ERE도 지원합니다. 이는 Linux의 egrep 명령과 유사합니다.

ERE를 사용하면 메타 문자를 있는 그대로 처리하고 grep과 같은 문자열로 대체하지 않으려는 경우 이점이 있습니다. 이렇게 하면 grep의 경우에 필요한 것처럼 이스케이프 측면에서 더 많은 유연성을 얻을 수 있습니다. 즉, grep과 함께 -E 를 사용하는 것은 egrep 명령과 동일합니다.

 $ grep -E '[Extended RegEx]' [file]

다음은 주석이 없거나 비어 있지 않은 행을 인쇄하려는 ERE의 한 가지 용도입니다. 이것은 큰 구성 파일에서 무언가를 찾는 데 특히 유용합니다. 패턴 '^(#|$)' 과 일치하는 줄을 인쇄하지 않기 위해 -v 플래그를 추가로 사용했습니다.

 $ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $

결론

위의 예는 빙산의 일각에 불과합니다. grep은 다양한 옵션을 지원하며 이를 효과적으로 사용하는 방법을 아는 사람이 사용하면 매우 유용한 도구가 될 수 있습니다. 위에 주어진 예를 사용할 수 있을 뿐만 아니라 필요한 것을 얻기 위해 다양한 방법으로 결합할 수 있습니다.

자세한 내용은 매뉴얼 페이지를 참조하십시오.

 $ man grep

다음으로 SFTP 명령 예제를 배웁니다.