
Linux에서 이상한 문자열이 무엇인지 궁금하십니까? 그들은 당신에게 명령 줄 마술을 제공합니다! 정규식 주문을 시전하고 명령 줄 기술을 높이는 방법을 알려 드리겠습니다.
정규식이란 무엇입니까?
정규식 (정규식)은 일치하는 문자 시퀀스를 찾는 방법입니다. 문자 나 기호를 사용하여 파일이나 스트림에서 검색되는 패턴을 정의합니다. 정규식에는 여러 가지 다른 풍미가 있습니다. 다음과 같은 일반적인 Linux 유틸리티 및 명령에 사용 된 버전을 살펴 보겠습니다. grep검색 패턴과 일치하는 행을 인쇄하는 명령입니다.
전체 책은 정규 표현식에 대해 작성되었으므로이 자습서는 소개 일뿐입니다. 기본 정규식과 확장 정규식이 있으며 여기서 확장 식을 사용합니다.
확장 정규식을 함께 사용하려면 grep, 당신은 -E (확장 된) 옵션. 이것은 매우 번거롭기 때문에 egrep 명령이 작성되었습니다. 그만큼 egrep 명령은 grep -E 조합하여 사용하면됩니다. -E 매번 옵션.
사용하기가 더 편리하다면 egrep할 수 있습니다. 그러나 공식적으로 사용되지 않습니다. 우리가 확인한 모든 배포판에 여전히 존재하지만 나중에 사라질 수 있습니다.
물론, 항상 자신 만의 별칭을 만들 수 있으므로 선호하는 옵션이 항상 포함됩니다.
관련 : Linux에서 별명 및 쉘 기능을 작성하는 방법
작은 시작부터
이 예에서는 Geeks 목록이 포함 된 일반 텍스트 파일을 사용합니다. 많은 Linux 명령과 함께 정규식을 사용할 수 있습니다. 우리는 단지 사용하고 있습니다 grep 그들을 설명하는 편리한 방법으로.
파일 내용은 다음과 같습니다.
less geek.txt

파일의 첫 부분이 표시됩니다.

간단한 검색 패턴으로 시작하여 파일에서 문자 “o”가 나타나는지 검색해 봅시다. 다시 사용하기 때문에 -E 모든 예제에서 (확장 정규식) 옵션을 사용하여 다음을 입력하십시오.
grep -E 'o' geeks.txt

검색 패턴이 포함 된 각 줄이 표시되고 일치하는 문자가 강조 표시됩니다. 제약없이 간단한 검색을 수행했습니다. 글자가 두 번 이상, 문자열의 끝에서, 같은 단어에서 두 번 또는 그 옆에 나타나는지는 중요하지 않습니다.
두 명의 이름에는 이중 O가있었습니다. 우리는 그것들 만 나열하기 위해 다음을 입력합니다 :
grep -E 'oo' geeks.txt

예상대로 결과 집합은 훨씬 작으며 검색어는 문자 그대로 해석됩니다. 입력 한 것 이외의 다른 의미는 아닙니다 : 이중“o”문자.
앞으로 나아갈수록 검색 패턴에 더 많은 기능이 제공됩니다.
줄 번호 및 기타 그렙 트릭
네가 원한다면 grep 일치하는 항목의 줄 번호를 나열하려면 -n (행 번호) 옵션. 이것은 grep 트릭 — 정규식 기능의 일부가 아닙니다. 그러나 때로는 파일에서 일치하는 항목이있는 위치를 알고 싶을 수도 있습니다.
우리는 다음을 입력합니다 :
grep -E -n 'o' geeks.txt

또 다른 편리한 grep 사용할 수있는 트릭은 -o (일치하는 것만) 옵션. 주변 텍스트가 아닌 일치하는 문자 시퀀스 만 표시합니다. 이것은 라인에서 중복 된 일치 항목을 신속하게 스캔해야하는 경우에 유용합니다.
이렇게하려면 다음을 입력하십시오.
grep -E -n -o 'o' geeks.txt

출력을 최소로 줄이려면 -c (카운트) 옵션.
일치하는 파일이 포함 된 파일의 줄 수를 보려면 다음을 입력하십시오.
grep -E -c 'o' geeks.txt

대체 연산자
이중 “l”과 이중 “o”를 모두 찾으려면 파이프를 사용할 수 있습니다 (|) 문자, 대체 연산자입니다. 왼쪽 또는 오른쪽의 검색 패턴과 일치하는 항목을 찾습니다.
우리는 다음을 입력합니다 :
grep -E -n -o 'll|oo' geeks.txt

이중 “l”, “o”또는 둘 다를 포함하는 행이 결과에 나타납니다.
대소 문자 구분
대체 연산자를 사용하여 다음과 같이 검색 패턴을 작성할 수도 있습니다.
am|Am
이것은 “am”과 “Am”과 모두 일치합니다. 사소한 예 이외의 다른 경우, 이것은 귀찮은 검색 패턴으로 빠르게 이어집니다. 이 문제를 해결하는 쉬운 방법은 -i (케이스 무시) 옵션 grep.
이렇게하려면 다음을 입력하십시오.
grep -E 'am' geeks.txt
grep -E -i 'am' geeks.txt

첫 번째 명령은 3 개의 일치 항목이 강조 표시된 3 개의 결과를 생성합니다. “Amanda”의 “Am”도 일치하므로 두 번째 명령은 4 개의 결과를 생성합니다.
정박
다른 방법으로 “Am”시퀀스를 일치시킬 수도 있습니다. 예를 들어, 해당 패턴을 구체적으로 검색하거나 대소 문자를 무시하고 시퀀스가 행의 시작 부분에 나타나도록 지정할 수 있습니다.
문자 또는 단어의 특정 부분에 나타나는 시퀀스를 일치시키는 것을 고정이라고합니다. 캐럿 (^) 기호는 검색 패턴을 나타 내기 위해 행의 시작 부분에 나타나는 경우 문자 시퀀스를 일치로 간주해야합니다.
우리는 다음을 입력합니다 (캐럿은 작은 따옴표 안에 있습니다) :
grep -E‘Am’geeks.txt
grep -E -i '^am' geeks.txt

이 두 명령은 모두 “Am”과 일치합니다.
이제 줄 끝에 이중 “n”이 포함 된 줄을 찾아 보겠습니다.
달러 기호를 사용하여 다음을 입력합니다 ($)를 사용하여 줄의 끝을 나타냅니다.
grep -E -i 'nn' geeks.txt
grep -E -i 'nn$' geeks.txt

와일드 카드
마침표 ( . )를 사용하여 단일 문자를 나타냅니다.
“T”로 시작하고 “m”으로 끝나고 그 사이에 단일 문자가있는 패턴을 검색하려면 다음을 입력하십시오.
grep -E 'T.m' geeks.txt

검색 패턴은 “Tim”및 “Tom”시퀀스와 일치합니다. 마침표를 반복하여 특정 문자 수를 나타낼 수도 있습니다.
우리는 중간 세 문자가 무엇인지 상관하지 않음을 나타 내기 위해 다음을 입력합니다.
grep-E 'J...n' geeks.txt

“Jason”이 포함 된 줄이 일치하여 표시됩니다.
별표 (*)를 사용하여 선행 문자가 0 번 이상 일치하도록합니다. 이 예에서 별표 앞에 오는 문자는 마침표 (.)는 어떤 문자를 의미합니다.
이것은 별표 (*)는 임의의 문자 발생 횟수 (0 포함)와 일치합니다.
별표는 때때로 신규 이민자를 혼동하기도합니다. 아마도 “어떤 것”을 의미하는 와일드 카드로 사용하기 때문일 수 있습니다.
그러나 정규 표현식에서는 'c*t' “cat”, “cot”, “coot” “등과 일치하지 않습니다. 오히려”0 “이상의”c “문자와 일치하고”t “와 일치합니다. 따라서 “t”, “ct”, “cct”, “ccct”또는 여러 “c”문자와 일치합니다.
파일 내용의 형식을 알고 있기 때문에 검색 패턴에서 마지막 문자로 공백을 추가 할 수 있습니다. 공백은 파일 이름과 성 사이에서만 파일에 나타납니다.
따라서 다음을 입력하여 파일의 이름 만 검색에 포함시킵니다.
grep -E 'J.*n ' geeks.txt
grep -E 'J.*n ' geeks.txt

언뜻보기에 첫 번째 명령의 결과에는 이상한 일치 항목이 포함 된 것으로 보입니다. 그러나 그것들은 모두 우리가 사용한 검색 패턴의 규칙과 일치합니다.
순서는 대문자 “J”로 시작하고 그 뒤에 문자 수, “n”이 와야합니다. 그럼에도 불구하고 모든 경기는 “J”로 시작하여 “n”으로 끝나지만 일부는 예상치 못한 결과입니다.
두 번째 검색 패턴에 공백을 추가 했으므로 “J”로 시작하고 “n”으로 끝나는 모든 이름이 의도 된 것입니다.
캐릭터 클래스
대문자 “N”또는 “W”로 시작하는 모든 줄을 찾고 싶다고합시다.
다음 명령을 사용하면 행의 위치에 상관없이 대문자 “N”또는 “W”로 시작하는 시퀀스를 가진 행과 일치합니다.
grep -E 'N|W' geeks.txt
그것은 우리가 원하는 것이 아닙니다. 라인 앵커 시작을 적용하면 (^) 검색 패턴의 시작 부분에서 아래와 같이 동일한 결과 집합을 얻을 수 있지만 다른 이유가 있습니다.
grep -E '^N|W' geeks.txt

검색은 행의 어느 위치 에나 대문자 “W”를 포함하는 행과 일치합니다. 또한 대문자 “N”으로 시작하므로 “No more”줄과도 일치합니다. 라인 앵커의 시작 (^)는 대문자 'N'에만 적용됩니다.
또한 자본 “W”에 줄 시작점을 추가 할 수 있지만, 간단한 예제보다 더 복잡한 검색 패턴에서는 곧 비효율적 일 것입니다.
해결책은 검색 패턴의 일부를 괄호로 묶는 것입니다 (()) 및 앵커 연산자를 그룹에 적용하십시오. 괄호 (())은 “이 목록의 모든 문자”를 의미합니다. 이것은 우리가 (|) 교체 연산자가 필요하지 않기 때문에
괄호 안의 목록에있는 모든 요소에 줄 시작점을 적용 할 수 있습니다 (()). (라인 앵커의 시작은 브래킷 외부에 있습니다).
대문자 “N”또는 “W”로 시작하는 행을 검색하려면 다음을 입력하십시오.
grep -E '^(NW)' geeks.txt

다음 명령 세트에서도 이러한 개념을 사용할 것입니다.
Tom 또는 Tim이라는 사람을 검색하려면 다음을 입력하십시오.
grep -E 'T(oi)m' geeks.txt
캐럿이^)는 괄호 (())에서 검색 패턴은 목록에 나타나지 않는 문자를 찾습니다.
예를 들어, “T”로 시작하고 “m”으로 끝나고 중간 문자가 “o”가 아닌 이름을 찾으려면 다음을 입력합니다.
grep -E 'T(^o)m' geeks.txt
목록에 여러 문자를 포함 할 수 있습니다. “T”로 시작하고 “m”으로 끝나고 중간에 모음이 포함 된 이름을 찾으려면 다음을 입력합니다.
grep -E 'T(aeiou)m' geeks.txt

간격 식
간격 표현식을 사용하여 일치하는 문자열에서 선행 문자 또는 그룹을 찾을 횟수를 지정할 수 있습니다. 번호는 중괄호로 묶습니다 ({}).
숫자 자체는 구체적으로 해당 숫자를 의미하지만 쉼표 (,)는 해당 숫자 이상을 의미합니다. 쉼표로 두 숫자를 구분하면 (1,2), 가장 작은 숫자부터 가장 큰 숫자의 범위를 의미합니다.
“T”로 시작하고 그 뒤에 최소한 하나는 있지만 연속 모음이 두 개 이상없고“m”으로 끝나는 이름을 찾고 싶습니다.
따라서 다음 명령을 입력하십시오.
grep -E 'T(aeiou){1,2}m' geeks.txt

이것은 “Tim”, “Tom”및 “Team”과 일치합니다.
시퀀스 “el”을 검색하려면 다음을 입력하십시오.
grep -E 'el' geeks.txt
검색 패턴에 두 번째“l”을 추가하여 이중“l”을 포함하는 시퀀스 만 포함합니다.
grep -E 'ell' geeks.txt
이것은이 명령과 동일합니다 :
grep -E 'el{2}' geeks.txt
“l”의 “적어도 1 개에서 2 개까지”의 범위를 제공하면 “el”및 “ell”시퀀스와 일치합니다.
이것은 “ell”시퀀스 내부의 것을 포함하여 “el”시퀀스에 대한 모든 일치가 포함 된이 네 가지 명령 중 첫 번째 명령의 결과와 미묘하게 다릅니다 (단 하나의 “l”만 강조 표시됨).
우리는 다음을 입력합니다 :
grep -E 'el{1,2}' geeks.txt

둘 이상의 모음의 모든 시퀀스를 찾으려면 다음 명령을 입력하십시오.
grep -E '(aeiou){2,}' geeks.txt

이스케이프 문자
마침표가있는 줄을 찾고 싶다고 가정 해 보겠습니다 (.) 마지막 문자입니다. 우리는 달러 기호를 알고 있습니다.$)는 행 앵커의 끝이므로 다음과 같이 입력 할 수 있습니다.
grep -E '.$' geeks.txt

그러나 아래와 같이 예상 한 결과를 얻지 못했습니다.

앞서 살펴본 바와 같이.)는 모든 단일 문자와 일치합니다. 모든 줄은 문자로 끝나기 때문에 모든 줄이 결과에 반환되었습니다.
그렇다면 실제 문자 만 검색하려고 할 때 특수 문자가 정규식 기능을 수행하지 못하게하려면 어떻게해야합니까? 이렇게하려면 백 슬래시 () 문자를 탈출합니다.
우리가 사용하는 이유 중 하나는 -E (확장 된) 옵션은 기본 정규식을 사용할 때 이스케이프가 덜 필요하기 때문입니다.
우리는 다음을 입력합니다 :
grep -e '.$' geeks.txt

실제 마침표 (.)를 줄 끝에서.
정박과 단어
우리는 시작을 모두 다루었 다.^) 및 줄 끝 ($) 위의 앵커. 그러나 다른 앵커를 사용하여 단어의 경계에서 작동 할 수 있습니다.
이 문맥에서 단어는 공백 (줄의 시작 또는 끝)으로 묶인 일련의 문자입니다. 따라서“psy66oh”는 사전에서 찾을 수 없지만 단어로 간주됩니다.
단어 앵커의 시작은 (<); 단어의 시작 부분을 왼쪽으로 가리 킵니다. 이름이 모두 소문자로 잘못 입력되었다고 가정하겠습니다. 우리는 grep을 사용할 수 있습니다 -i 대소 문자를 구분하지 않고 "h"로 시작하는 이름을 찾기위한 옵션입니다.
우리는 다음을 입력합니다 :
grep -E -i 'h' geeks.txt
그것은 단어의 시작 부분뿐만 아니라 "h"의 모든 발생을 찾습니다.
grep -E -i '이것은 단어의 시작 부분에서만 찾습니다.
문자“y”와 비슷한 것을 해봅시다. 우리는 단어의 끝에있는 사례 만보고 싶습니다. 우리는 다음을 입력합니다 :
grep -E 'y' geeks.txt이것은 단어에서 나타나는 "y"의 모든 어커런스를 찾습니다.
이제 앵커의 끝을 사용하여 다음을 입력합니다.
/>) (오른쪽 또는 단어의 끝을 가리킴) :grep -E 'y>' geeks.txt
두 번째 명령은 원하는 결과를 생성합니다.
전체 단어를 찾는 검색 패턴을 만들려면 경계 연산자 (
b). 경계 연산자 (B)를 사용하여 더 큰 단어 안에 있어야하는 일련의 문자를 찾으십시오.grep -E 'bGlennb' geeks.txtgrep -E 'BwayB' geeks.txt
더 많은 캐릭터 클래스
바로 가기를 사용하여 문자 클래스로 목록을 지정할 수 있습니다. 이 범위 표시기는 목록의 모든 구성원을 검색 패턴에 입력하지 않아도됩니다.
다음을 모두 사용할 수 있습니다.
- A-Z : "A"에서 "Z"까지의 모든 대문자
- a-z : “a”에서“z”까지 모두 소문자입니다.
- 0-9 : 0에서 9까지의 모든 숫자
- d-p : "d"에서 "p"까지의 모든 소문자 이 자유 형식 스타일을 사용하면 고유 한 범위를 정의 할 수 있습니다.
- 2-7 : 2에서 7까지의 모든 숫자입니다.
검색 패턴에서 원하는만큼의 문자 클래스를 사용할 수도 있습니다. 다음 검색 패턴은 "J"로 시작하고 "o"또는 "s"로 시작한 다음 "e", "h", "l"또는 "s"로 시작하는 시퀀스와 일치합니다.
grep -E 'J(os)(ehls)' geeks.txt
다음 명령에서는
a-z범위 지정자.검색 명령은 다음과 같이 분류됩니다.
- H : 시퀀스는 "H"로 시작해야합니다.
- (a-z) : 다음 문자는이 범위의 소문자 일 수 있습니다.
- * : 여기서 별표는 여러 개의 소문자를 나타냅니다.
- 남자: 순서는 "man"으로 끝나야합니다.
다음 명령으로 모두 정리했습니다.
grep -E 'H(a-z)*man' geeks.txt
뚫을 수없는 것은 없습니다
일부 정규 표현식은 시각적으로 구문 분석하기가 어려워 질 수 있습니다. 사람들이 복잡한 정규 표현식을 작성할 때 보통 소규모로 시작하여 작동 할 때까지 점점 더 많은 섹션을 추가합니다. 그들은 시간이 지남에 따라 정교함이 증가하는 경향이 있습니다.
최종 버전에서 거꾸로 작업하여 기능을 확인하려고하면 완전히 다른 도전입니다.
예를 들어 다음 명령을보십시오.
grep -E '^((0-9){4}(- )){3}(0-9){4}|(0-9){16}' geeks.txt이것을 풀기 시작하는 곳은 어디입니까? 처음부터 시작해서 한 번에 한 덩어리 씩 가져갑니다.
- ^ : 라인 앵커의 시작. 따라서 시퀀스는 첫 줄에 있어야합니다.
- ((0-9) {4} (-)) : 괄호는 검색 패턴 요소를 그룹으로 모 읍니다. 다른 작업을이 그룹에 전체적으로 적용 할 수 있습니다 (나중에 자세히 설명). 첫 번째 요소는 0에서 9까지의 숫자 범위를 포함하는 문자 클래스입니다.
(0-9). 첫 번째 문자는 0에서 9까지의 숫자입니다. 다음으로 숫자 4를 포함하는 구간 표현식이 있습니다.{4}. 이것은 첫 번째 문자에 적용되며 숫자입니다. 따라서 검색 패턴의 첫 번째 부분은 이제 네 자리입니다. 뒤에 공백이나 하이픈 ((- )) 다른 캐릭터 클래스에서.- {삼}: 숫자 3을 포함하는 간격 지정자가 그룹 바로 뒤에옵니다. 전체 그룹에 적용되므로 검색 패턴은 이제 네 자리 숫자이며 그 뒤에 공백이나 하이픈이 있으며 세 번 반복됩니다.
- (0-9) : 다음으로, 우리는 0에서 9까지의 숫자 범위를 포함하는 또 다른 문자 클래스를 가지고 있습니다.
(0-9). 검색 패턴에 다른 문자를 추가하며 0에서 9까지의 숫자 일 수 있습니다.- {4} : 숫자 4를 포함하는 다른 간격 표현식이 이전 문자에 적용됩니다. 이것은 문자가 4 개의 문자가되며 0에서 9까지의 숫자 일 수 있음을 의미합니다.
- | : 대체 연산자는 왼쪽에있는 모든 것이 완전한 검색 패턴이며 오른쪽에있는 모든 것은 새로운 검색 패턴입니다. 따라서이 명령은 실제로 두 가지 검색 패턴 중 하나를 검색합니다. 첫 번째는 네 자리의 세 그룹으로 구성되며 공백이나 하이픈이 뒤 따르고 또 다른 네 자리가 표시됩니다.
- (0-9) : 두 번째 검색 패턴은 0에서 9까지의 숫자로 시작합니다.
- {16} : 간격 연산자는 첫 번째 문자에 적용되고 16 자 (모두 숫자)로 변환됩니다.
검색 패턴은 다음 중 하나를 찾습니다.
- 공백이나 하이픈 (,
-).- 16 자리 한 그룹.
결과는 아래와 같습니다.
이 검색 패턴은 신용 카드 번호를 쓰는 일반적인 형태를 찾고 있습니다. 또한 하나의 명령으로 다양한 스타일을 찾을 수있을 정도로 다재다능합니다.
천천히 해
복잡성은 대개 많은 단순성으로 묶여 있습니다. 기본 구성 요소를 이해하면 효율적이고 강력한 유틸리티를 만들고 귀중한 새로운 기술을 개발할 수 있습니다.














