SW/리눅스

Regex : Grep : 정규식 표현 사용 방법, 예제, 명령어

얇은생각 2022. 7. 26. 07:30
반응형

grep는 텍스트 처리를 위한 Linux에서 가장 유용하고 강력한 명령 중 하나입니다. grep는 하나 이상의 입력 파일에서 정규식과 일치하는 줄을 검색하고 각 일치하는 줄을 표준 출력에 씁니다.

이 문서에서는 대부분의 Linux 운영 체제에서 기본적으로 제공되는 Grep의 GNU 버전에서 정규식을 사용하는 방법에 대한 기본 사항에 대해 알아보겠습니다.

 

 

Regex : Grep : 정규식 표현 사용 방법, 예제, 명령어

 

 

Grep 정규식

정규식 또는 정규식은 문자열 집합과 일치하는 패턴입니다. 패턴은 특별한 의미가 있는 연산자, 리터럴 문자 및 메타 문자로 구성됩니다. GNU grep는 Basic, Extended 및 Perl 호환의 세 가지 정규식 구문을 지원합니다.

정규식 유형이 지정되지 않은 가장 간단한 형식으로 grep는 검색 패턴을 기본 정규식으로 해석합니다. 패턴을 확장 정규식으로 해석하려면 -E( 또는 --extended-regexp) 옵션을 사용하십시오.

GNU의 grep 구현에서는 기본 정규식 구문과 확장 정규식 구문 사이에 함수적 차이가 없습니다. 유일한 차이점은 기본 정규식에서 메타 문자는 문자 그대로 해석된다는 것입니다. 기본 정규식을 사용할 때 메타 문자의 특수 의미를 유지하려면 문자를 백슬래시(\)로 이스케이프해야 합니다. 이것들과 다른 메타캐릭터의 의미에 대해 나중에 설명할 것입니다.

일반적으로 셸에 의한 메타 문자의 해석 및 확장을 방지하려면 정규식을 항상 작은 따옴표로 묶어야 합니다.

 

 

 

리터럴 일치

grep 명령어의 가장 기본적인 용도는 파일에서 리터럴 문자 또는 일련의 문자를 검색하는 것입니다. 예를 들어 /etc/passwd 파일에 "bash" 문자열이 포함된 모든 줄을 표시하려면 다음 명령을 실행합니다.

grep bash /etc/passwd

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

 

 

이 예에서 문자열 "bash"는 4개의 리터럴 문자로 구성된 기본 정규식입니다. 그러면 grep에서 "b", "s" 및 "h" 바로 뒤에 "b"가 있는 문자열을 검색하도록 지시합니다.

기본적으로 grep 명령은 대소문자를 구분합니다. 즉, 대소문자가 구별됩니다.

검색할 때 대소문자를 무시하려면 -i 옵션(또는 --무시 대/소문자)을 사용하십시오.

grep는 검색 패턴을 단어가 아닌 문자열로 찾습니다. 따라서 "gnu"를 검색할 경우 grep는 "gnu"가 포함된 줄을 "sygnus"나 "magnum"과 같은 더 큰 단어로 인쇄합니다.

검색 문자열에 공백이 포함된 경우 다음과 같이 작은 따옴표 또는 큰 따옴표로 묶어야 합니다.

grep "Gnome Display Manager" /etc/passwd

 

 

 

고정

앵커란 줄에서 일치 항목이 있어야 하는 위치를 지정할 수 있는 메타 문자입니다.

^(caret) 기호는 줄의 시작 부분에 있는 빈 문자열과 일치합니다. 다음 예제에서 문자열 "linux"는 줄의 맨 처음에 발생하는 경우에만 일치합니다.

grep '^linux' file.txt

 

 

$(달러) 기호는 줄의 시작 부분에 있는 빈 문자열과 일치합니다. 문자열 "linux"로 끝나는 줄을 찾으려면 다음을 사용합니다.

grep 'linux$' file.txt

 

 

두 앵커를 모두 사용하여 정규식을 구성할 수도 있습니다. 예를 들어, "linux"만 포함된 줄을 찾으려면 다음을 실행합니다.

grep '^linux$' file.txt

 

 

다른 유용한 예는 모든 빈 줄과 일치하는 ^$ 패턴입니다.

 

 

 

단일 문자와 일치

. ( 마침표) 기호는 단일 문자와 일치하는 메타 문자입니다. 예를 들어, "kan"으로 시작한 다음 두 개의 문자가 있고 "rooo" 문자열로 끝나는 항목을 일치시키려면 다음 패턴을 사용합니다.

grep 'kan..roo' file.txt

 

 

 

대괄호 식

대괄호 표현식은 []로 묶어서 문자 그룹을 일치시킬 수 있습니다. 예를 들어, "accept" 또는 "accent"가 포함된 행을 찾은 경우 다음 식을 사용할 수 있습니다.

grep 'acce[np]t' file.txt

 

 

대괄호 안의 첫 번째 문자가 캐럿 ^인 경우 대괄호로 묶이지 않은 단일 문자와 일치합니다. 다음 패턴은 "co"로 시작하는 문자열의 조합과 "coca", "covalt" 등과 같이 "la"를 제외한 모든 문자열의 조합과 일치하지만 "cola"를 포함하는 줄은 일치하지 않습니다.

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

 

 

문자를 하나씩 배치하는 대신 대괄호 안에 문자 범위를 지정할 수 있습니다. 범위 표현식은 하이픈으로 구분된 범위의 첫 번째 및 마지막 문자를 지정하여 구성됩니다. 예를 들어, [a-a]는 [abcde]와 같고 [1-3]은 [123]과 같습니다.

다음 식은 대문자로 시작하는 각 줄을 일치시킵니다.

grep '^[A-Z]' file.txt

 

 

grep는 또한 대괄호로 묶인 미리 정의된 문자 클래스도 지원합니다. 다음 표는 가장 일반적인 문자 클래스 중 일부를 보여줍니다.

 

정량자 문자 클래스입니다.

[:alnum:] :  영숫자 문자입니다.

[:alpha:] : 알파벳 문자입니다.

[:blank:] : 공백과 탭입니다.

[:digit:] : 숫자요.

[:lower:] : 소문자입니다.

[:upper:] : 대문자입니다.

 

모든 문자 클래스의 전체 목록을 보려면 Grep 매뉴얼을 확인하십시오.

 

 

 

계량자

정량자를 사용하면 일치가 발생하기 위해 존재해야 하는 항목의 발생 횟수를 지정할 수 있습니다. 다음 표에서는 GNU grep에서 지원되는 정량자를 보여 줍니다.

 

* 앞의 항목을 0번 이상 일치시키세요.

? 앞의 항목 0을 한 번 또는 한 번 일치시키세요.

+ 앞의 항목을 한 번 이상 일치시킵니다.

{n} 앞의 항목을 정확히 n번 일치시킵니다.

{n,} 이전 항목을 n번 이상 일치시킵니다.

{,m} 이전 항목을 최대 m번 일치시킵니다.

{n,m} 앞의 항목을 n번부터 m번까지 일치시킵니다.

 

*(아스테리스크) 문자는 이전 항목과 0회 이상 일치합니다. 다음은 "right", "sright" "ssright" 등과 일치합니다.

grep 's*right'

 

 

아래는 대문자로 시작하고 마침표 또는 쉼표로 끝나는 모든 줄과 일치하는 고급 패턴입니다. .* 정규식은 모든 문자와 일치합니다.

grep -E '^[A-Z].*[.,]$' file.txt

 

 

?(물음표) 문자는 앞의 항목을 선택사항으로 지정하며 한 번만 일치시킬 수 있습니다. 다음은 "밝음"과 "오른쪽" 모두 일치합니다. 다음과 같은 기본 정규식을 사용하므로 백슬래시를 사용하여 ? 문자를 이스케이프합니다.

grep 'b\?right' file.txt

 

 

다음은 확장 정규식을 사용한 동일한 정규식입니다.

grep -E 'b?right' file.txt

 

 

+(더하기) 문자는 이전 항목과 한 번 이상 일치합니다. 다음은 "ssright"과 "sright"가 일치하지만 "right"은 일치하지 않습니다.

grep -E 's+right' file.txt

 

 

중괄호 문자 {}을(를) 사용하면 일치 발생에 필요한 정확한 숫자, 상한 또는 하한 또는 발생 범위를 지정할 수 있습니다.

다음은 3~9자리 사이의 모든 정수와 일치합니다.

grep -E '[[:digit:]]{3,9}' file.txt

 

 

 

대체

대체라는 용어는 단순 "OR"입니다. 대체 연산자 | (파이프)를 사용하면 리터럴 문자열 또는 식 집합일 수 있는 가능한 다른 일치 항목을 지정할 수 있습니다. 이 연산자는 모든 정규식 연산자 중 우선 순위가 가장 낮습니다.

아래 예에서는 Nginx 로그 오류 파일에서 fatal, error 및 critical이라는 단어가 모두 검색됩니다.

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

 

 

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

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

 

 

 

그룹화

그룹화는 패턴을 그룹화하여 하나의 항목으로 참조할 수 있는 정규식의 기능입니다. 그룹은 괄호()를 사용하여 만듭니다.

기본 정규식을 사용할 때는 괄호를 백슬래시(\)로 이스케이프해야 합니다.

다음 예제는 "fearless"과 "less"를 모두 일치시킵니다. ? 정량자는 (두려움) 그룹을 선택 사항으로 만듭니다.

grep -E '(fear)?less' file.txt

 

 

 

특수 백슬래시 표현식

GNU grep에는 백슬래시 뒤에 일반 문자로 구성된 여러 메타 문자가 포함되어 있습니다. 다음 표에서는 가장 일반적인 특수 백슬래시 표현식을 보여 줍니다.

 

\b 단어 경계를 일치시킵니다.

\< 단어의 시작 부분에 빈 문자열을 일치시킵니다.

\> 단어 끝에 빈 문자열을 일치시킵니다.

\w 단어를 일치시킵니다.

\s 공백을 일치시킵니다.

 

다음 패턴은 "abject" 및 "object"의 개별 단어와 일치합니다. 더 큰 단어로 삽입하면 단어와 일치하지 않습니다.

grep '\b[ao]bject\b' file.txt

 

 

정규식은 텍스트 편집기, 프로그래밍 언어 및 grep, sed 및 awk와 같은 명령줄 도구에 사용됩니다. 정규식을 구성하는 방법을 알면 텍스트 파일을 검색하거나 스크립트를 작성하거나 명령 출력을 필터링할 때 매우 유용할 수 있습니다.

 

 

 

참조

https://linuxize.com/post/regular-expressions-in-grep/

반응형