grep는 텍스트 처리를 위한 Linux에서 가장 유용하고 강력한 명령 중 하나입니다. grep는 하나 이상의 입력 파일에서 정규식과 일치하는 줄을 검색하고 각 일치하는 줄을 표준 출력에 씁니다.
이 문서에서는 대부분의 Linux 운영 체제에서 기본적으로 제공되는 Grep의 GNU 버전에서 정규식을 사용하는 방법에 대한 기본 사항에 대해 알아보겠습니다.
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와 같은 명령줄 도구에 사용됩니다. 정규식을 구성하는 방법을 알면 텍스트 파일을 검색하거나 스크립트를 작성하거나 명령 출력을 필터링할 때 매우 유용할 수 있습니다.
참조
'SW > 리눅스' 카테고리의 다른 글
Linux : CentOS 8 : R 설치 방법, 예제, 명령어 (1) | 2022.07.28 |
---|---|
Linux : CentOS 8 : FFmpeg 설치, 사용 예제, 방법, 명령어 (0) | 2022.07.27 |
Linux : Debian 10 : Apache Virtual Hosts 설정 방법, 예제, 명령어 (0) | 2022.07.25 |
Linux : CentOS 8 : GCC (Development Tools) 설치 방법, 예제, 명령어 (0) | 2022.07.24 |
Linux : chmod 777 의미 이해 방법, 예제, 명령어 (0) | 2022.07.23 |