GREP 및 정규식에 대한 교육 프로그램입니다. Linux에서 정규식(regex) 사용 정규식 테이블 grep

grep 유틸리티는 매우 강력한 검색 및 필터 도구입니다. 텍스트 정보. 이 기사에서는 그 기능을 평가할 수 있는 몇 가지 사용 예를 보여줍니다.
grep의 주요 용도는 파일 및 출력 스트림에서 단어나 구문을 검색하는 것입니다. 명령줄에 쿼리와 검색 영역(파일)을 입력하여 검색할 수 있습니다.
예를 들어, hystack.txt 파일에서 "needle"이라는 문자열을 찾으려면 다음 명령을 사용하십시오.

$ grep 바늘 haystack.txt

결과적으로 grep은 haystack.txt 파일의 내용에서 발견된 모든 needle 항목을 표시합니다. 이 경우 grep은 단어가 아닌 문자 집합을 찾는다는 점에 유의하는 것이 중요합니다. 예를 들어, "needless"라는 단어가 포함된 문자열과 "needle"이라는 시퀀스가 ​​포함된 다른 단어가 표시됩니다.


grep에게 특정 단어를 찾고 있음을 알리려면 -w 스위치를 사용하십시오. 이 키는 지정된 단어로만 검색을 제한합니다. 단어는 양쪽이 공백, 구두점 또는 줄바꿈으로 구분된 쿼리입니다.

$ grep -w 바늘 haystack.txt

검색을 하나의 파일로 제한할 필요는 없습니다. grep은 파일 그룹 전체를 검색할 수 있으며 검색 결과는 일치하는 항목이 발견된 파일을 나타냅니다. -n 스위치는 일치 항목이 발견된 줄 번호도 추가하고 -r 스위치를 사용하면 재귀 검색을 수행할 수 있습니다. 이는 프로그램 소스코드가 포함된 파일을 검색할 때 매우 편리합니다.

$ grep -rnw 함수_이름 /home/www/dev/myprogram/

각 일치 항목 앞에 파일 이름이 나열됩니다. 파일 이름을 숨기려면 -h 스위치를 사용하고, 반대로 파일 이름만 필요하면 -l 스위치를 지정하십시오.
다음 예에서는 IRC 로그 파일에서 URL을 검색하고 마지막 10개의 일치 항목을 표시합니다.

$ grep -wo http://.* 채널.로그 | 꼬리

-o 옵션은 grep에게 전체 줄이 아닌 패턴 일치만 인쇄하도록 지시합니다. 파이프를 사용하여 grep의 출력을 tail 명령으로 리디렉션합니다. tail 명령은 기본적으로 마지막 10줄을 출력합니다.
이제 특정 사용자가 irc 채널로 보낸 메시지 수를 계산해 보겠습니다. 예를 들어 집과 직장에서 내가 보낸 모든 메시지. 닉네임이 다르며 집에서는 user_at_home이라는 닉네임을 사용하고 직장에서는 user_at_work를 사용합니다.

$ grep -c "^user_at_(집|직장)" 채널.로그

-c 옵션을 사용하면 grep은 일치 항목 자체가 아닌 발견된 일치 항목 수만 인쇄합니다. 검색 문자열에는 셸에서 제어 문자로 인식할 수 있는 특수 문자가 포함되어 있으므로 따옴표로 묶습니다. 검색 패턴에는 따옴표가 포함되지 않으니 주의하세요. 백슬래시 ""는 특수 문자를 이스케이프하는 데 사용됩니다.
채널에서 '비명 지르기'를 좋아하는 사람들의 메시지를 검색해 보겠습니다. "비명"이란 블론디 스타일로 모두 대문자로 작성된 메시지를 의미합니다. 검색에서 임의의 약어를 제외하기 위해 5자 이상의 단어를 검색합니다.

$ grep -w "+(5,)" 채널.로그

자세한 설명은 grep 매뉴얼 페이지를 참조하세요.
몇 가지 추가 예:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash Operator:x:11:0:operator:/root:/sbin/nologin

문자열 루트가 포함된 /etc/passwd 파일의 행을 표시합니다.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

또한, 검색된 라인이 포함된 라인 번호가 표시됩니다.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown quit:x:7:0:halt:/sbin ::/sbin/halt 뉴스:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X 글꼴 서버:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC 사용자:/:/bin/false nscd:x:28:28:NSCD 데몬:/:/bin/false 이름:x:25:25:이름:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP 사용자: /var/lib/ldap:/bin/false 아파치:x:48:48:Apache:/var/www:/bin/false

nologin이 쉘로 지정된 사용자 계정을 제외하고 bash를 사용하지 않는 사용자를 확인합니다.

# grep -c false /etc/passwd 7

쉘로 /bin/false가 있는 계정 수를 계산합니다.

# grep -i 게임 ~/.bash* | grep -v 기록

이 명령은 홈 디렉토리에 있는 모든 파일의 행을 표시합니다. 현재 사용자, 이름이 ~/.bash로 시작하는 파일(이름에 문자열 기록이 포함된 파일 제외)은 ~/.bash_history 파일에서 발견된 일치 항목을 제외하기 위한 것입니다. 이 파일의 상단이나 소문자에 동일한 줄이 있을 수 있습니다. "games"라는 단어가 검색되므로 다른 단어로 대체할 수 있습니다.
grep 명령 및 정규식

이전 예와 달리 이제 "root" 줄로 시작하는 줄만 표시합니다.

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

셸을 전혀 사용하지 않은 계정을 확인하려면 ":" 문자로 끝나는 줄을 찾습니다.

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

~/.bashrc 파일의 PATH 변수가 내보내졌는지 확인하려면 먼저 "export" 줄을 선택한 다음 "PATH" 줄로 시작하는 줄을 찾으세요. 이 경우 MANPATH 및 기타 항목은 표시되지 않습니다. 가능한 방법:

# grep 내보내기 ~/.bashrc | grep "PATH" 내보내기 PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

캐릭터 클래스

대괄호 안의 표현식은 [" 및 "]"" 문자로 묶인 문자 목록입니다. 이 목록에 지정된 단일 문자와 일치합니다. 목록의 첫 번째 문자가 "^"이면 목록에 없는 모든 문자와 일치합니다. 예를 들어 정규식 ""은 모든 단일 숫자와 일치합니다.

대괄호 안의 표현식 내에서 하이픈으로 구분된 두 문자로 구성된 범위를 지정할 수 있습니다. 그런 다음 표현식은 정렬 규칙에 따라 이 두 문자를 포함하여 이 두 문자 내에 속하는 모든 싱글톤과 일치합니다. 이는 로캘에 지정된 데이터 정렬 및 문자 집합을 고려합니다. 예를 들어, 기본 로케일이 C인 경우 "" 표현식은 "" 표현식과 동일합니다. 정렬이 사전 순서로 수행되는 로캘이 많이 있으며 이러한 로캘에서 ""는 일반적으로 ""와 동일하지 않습니다. 예를 들어 ""라는 표현과 동일할 수 있습니다. 대괄호로 묶인 표현식의 기존 해석을 사용하려면 LC_ALL 환경 변수를 "C"로 설정하여 C 로케일을 사용할 수 있습니다.

마지막으로 특수하게 명명된 문자 클래스가 있는데, 이는 대괄호로 묶인 표현식 내부에 지정됩니다. 추가 정보이러한 사전 정의된 표현식에 대한 자세한 내용은 매뉴얼 페이지나 grep 명령 설명서를 참조하십시오.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: none:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: 접미사:x:89:

이 예에서는 문자 "y" 또는 문자 "f"가 포함된 모든 행을 표시합니다.
범용 문자(메타문자)

사용 "." 단일 문자와 일치합니다. "c"로 시작하고 "h"로 끝나는 5개의 문자를 포함하는 사전에서 가져온 모든 영어 단어 목록을 원하는 경우(크로스워드 퍼즐을 푸는 데 유용함):

# grep " " /usr/share/dict/words 충돌 천 코치 소파 기침 충돌 충돌 잡기

마침표 문자가 포함된 행을 리터럴로 표시하려면 grep 명령에 -F 옵션을 지정하십시오. 기호 "< " и «>"는 지정된 문자 앞과 뒤에 빈 줄이 있음을 의미합니다. 이는 단어 파일의 단어를 그에 맞게 작성해야 함을 의미합니다. 빈 줄을 고려하지 않고 지정된 패턴에 따라 텍스트의 모든 단어를 찾으려면 " 기호를 생략하십시오.< " и «>", 단어만 보다 정확하게 검색하려면 -w 스위치를 사용하세요.

유사하게 "c"와 "h" 사이에 임의 개수의 문자를 포함할 수 있는 단어를 찾으려면 별표(*)를 사용하십시오. 아래 예에서는 시스템 사전에서 "c"로 시작하고 "h"로 끝나는 모든 단어를 선택합니다.

# grep " " /usr/share/dict/words caliph 캐치 캐치 치즈클로스 치타 --출력 생략됨--

파일이나 출력 스트림에서 리터럴 별표 문자를 찾으려면 다음을 사용하십시오. 작은따옴표. 아래 예의 사용자는 먼저 따옴표를 사용하지 않고 /etc/profile 파일에서 "별표"를 찾으려고 시도하지만 아무 것도 발견되지 않습니다. 따옴표를 사용하면 결과가 출력됩니다.

# grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh ; 하다

sed 및 awk를 사용하여 bash 스크립트의 텍스트를 완전히 처리하려면 정규식을 이해하면 됩니다. 이 가장 유용한 도구의 구현은 말 그대로 어디에서나 찾을 수 있으며 모든 정규식은 비슷한 방식으로 구조화되고 동일한 아이디어를 기반으로 하지만 서로 다른 환경에서 이를 사용하면 특정 기능이 있습니다. 여기서는 스크립트에 사용하기에 적합한 정규식에 대해 이야기하겠습니다. 명령줄리눅스.

이 자료는 정규 표현식에 대한 소개로 작성되었으며 정규 표현식이 무엇인지 전혀 모르는 사람들을 위한 것입니다. 그럼 처음부터 시작해 보겠습니다.

정규 표현식이란 무엇입니까?

많은 사람들은 처음 정규식을 보면 의미 없이 뒤죽박죽된 문자를 보고 있다고 즉시 생각합니다. 그러나 물론 이것은 사실과 거리가 멀다. 예를 들어 이 정규식을 살펴보세요.


우리 의견으로는 완전 초보자라도 그것이 어떻게 작동하고 왜 필요한지 즉시 이해할 것입니다. :) 잘 이해하지 못하더라도 계속 읽으면 모든 것이 제자리에 들어갈 것입니다.
정규식은 sed 또는 awk와 같은 프로그램이 텍스트를 필터링하는 데 사용하는 패턴입니다. 템플릿은 자신을 나타내는 일반 ASCII 문자와 특정 문자 그룹에 대한 참조를 허용하는 등 특별한 역할을 하는 소위 메타 문자를 사용합니다.

정규 표현식의 유형

예를 들어 Java, Perl 및 Python과 같은 프로그래밍 언어와 sed, awk 및 grep과 같은 Linux 도구에서 다양한 환경에서 정규식을 구현하면 특정 기능이 있습니다. 이러한 기능은 패턴을 해석하는 소위 정규식 엔진에 따라 달라집니다.
Linux에는 두 가지 정규식 엔진이 있습니다.
  • POSIX BRE(Basic Regular Expression) 표준을 지원하는 엔진입니다.
  • POSIX ERE(확장 정규 표현식) 표준을 지원하는 엔진입니다.
대부분의 Linux 유틸리티는 최소한 POSIX BRE 표준을 준수하지만 일부 유틸리티(sed 포함)는 BRE 표준의 하위 집합만 이해합니다. 이러한 제한의 이유 중 하나는 텍스트 처리에서 이러한 유틸리티를 가능한 한 빨리 만들고자 하기 때문입니다.

POSIX ERE 표준은 프로그래밍 언어로 구현되는 경우가 많습니다. 그것은 당신이 사용할 수 있습니다 큰 금액정규식 개발을 위한 도구. 예를 들어, 개별 단어나 텍스트의 숫자 집합을 검색하는 등 자주 사용되는 패턴에 대한 특수 문자 시퀀스일 수 있습니다. Awk는 ERE 표준을 지원합니다.

프로그래머의 의견과 정규식을 만든 엔진의 기능에 따라 정규식을 개발하는 방법에는 여러 가지가 있습니다. 모든 엔진이 이해할 수 있는 범용 정규식을 작성하는 것은 쉽지 않습니다. 따라서 가장 일반적으로 사용되는 정규식에 중점을 두고 sed 및 awk에 대한 구현 기능을 살펴보겠습니다.

POSIX BRE 정규식

아마도 가장 간단한 BRE 패턴은 텍스트에서 문자 시퀀스의 정확한 발생을 검색하기 위한 정규식일 것입니다. sed 및 awk에서 문자열 검색은 다음과 같습니다.

$ echo "이것은 테스트입니다" | sed -n "/test/p" $ echo "이것은 테스트입니다" | awk "/test/($0 인쇄)"

sed에서 패턴으로 텍스트 찾기


awk에서 패턴으로 텍스트 찾기

줄에 있는 텍스트의 정확한 위치를 고려하지 않고 특정 패턴에 대한 검색이 수행되는 것을 볼 수 있습니다. 또한 발생 횟수는 중요하지 않습니다. 정규식을 찾은 후 주어진 텍스트라인의 어느 위치에서든 해당 라인은 적합한 것으로 간주되어 추가 처리를 위해 전달됩니다.

정규식으로 작업할 때는 대소문자를 구분한다는 점을 고려해야 합니다.

$ echo "이것은 테스트입니다" | awk "/Test/(print $0)" $ echo "이것은 테스트입니다" | awk "/test/($0 인쇄)"

정규 표현식은 대소문자를 구분합니다.

첫 번째 정규식은 대문자로 시작하는 "test"라는 단어가 텍스트에 나타나지 않기 때문에 일치하는 항목을 찾지 못했습니다. 두 번째는 대문자로 쓰여진 단어를 검색하도록 구성되었으며 스트림에서 적절한 줄을 찾았습니다.

정규식에서는 문자뿐만 아니라 공백과 숫자도 사용할 수 있습니다.

$ echo "다시 테스트 2입니다." | awk "/test 2/($0 인쇄)"

공백과 숫자가 포함된 텍스트 찾기

공백은 정규식 엔진에서 일반 문자로 처리됩니다.

특수 기호

사용 다양한 캐릭터정규식에서는 몇 가지 기능을 고려해야 합니다. 따라서 템플릿에서 이를 사용하려면 특별한 접근 방식이 필요한 일부 특수 문자 또는 메타 문자가 있습니다. 여기 있습니다:

.*^${}\+?|()
그 중 하나가 템플릿에 필요한 경우 백슬래시(백슬래시) - \ 를 사용하여 이스케이프해야 합니다.

예를 들어, 텍스트에서 달러 기호를 찾아야 하는 경우 이스케이프 문자 앞에 기호를 템플릿에 포함해야 합니다. 다음 텍스트가 포함된 myfile 파일이 있다고 가정해 보겠습니다.

내 주머니에 10달러가 있어
달러 기호는 다음 패턴을 사용하여 감지할 수 있습니다.

$awk "/\$/($0 인쇄)" myfile

패턴에 특수 문자 사용

또한 백슬래시도 특수 문자이므로 패턴에 사용해야 하는 경우 이스케이프 처리해야 합니다. 두 개의 슬래시가 서로 이어지는 것처럼 보입니다.

$ echo "\는 특수문자입니다." | awk "/\\/($0 인쇄)"

백슬래시 이스케이프

슬래시는 위의 특수 문자 목록에 포함되어 있지 않지만 sed 또는 awk용으로 작성된 정규식에서 슬래시를 사용하려고 하면 오류가 발생합니다.

$ 에코 "3/2" | awk "///($0 인쇄)"

패턴에서 슬래시를 잘못 사용함

필요한 경우 이스케이프해야 합니다.

$ 에코 "3/2" | awk "/\//($0 인쇄)"

슬래시 이스케이프

앵커 기호

패턴을 텍스트 문자열의 시작 또는 끝에 연결하기 위한 두 개의 특수 문자가 있습니다. 대문자 문자 - ^를 사용하면 텍스트 줄의 시작 부분에 있는 문자 시퀀스를 설명할 수 있습니다. 찾고 있는 패턴이 문자열의 다른 곳에 있으면 정규식은 이에 응답하지 않습니다. 이 기호의 사용법은 다음과 같습니다.

$ echo "likegeeks 웹사이트에 오신 것을 환영합니다" | awk "/^likegeeks/(print $0)" $ echo "likegeeks 웹사이트" | awk "/^likegeeks/($0 인쇄)"

문자열의 시작 부분에서 패턴 찾기

^ 문자는 줄의 시작 부분에서 패턴을 검색하도록 설계되었으며 문자의 대소문자도 고려됩니다. 이것이 텍스트 파일 처리에 어떤 영향을 미치는지 살펴보겠습니다.

$awk "/^this/($0 인쇄)" myfile


파일의 텍스트 줄 시작 부분에서 패턴 찾기

sed를 사용할 때 패턴 내부 어딘가에 대문자를 놓으면 다른 일반 문자처럼 처리됩니다.

$ echo "이것은 ^ 테스트입니다." | sed -n "/s ^/p"

sed의 패턴 시작 부분에 모자가 없습니다.

awk에서 동일한 템플릿을 사용할 때 이 문자를 이스케이프해야 합니다.

$ echo "이것은 ^ 테스트입니다." | awk "/s\^/($0 인쇄)"

awk의 템플릿 시작 부분에 표지가 없습니다.

우리는 줄의 시작 부분에 있는 텍스트 조각을 검색하는 방법을 알아냈습니다. 줄 끝에 있는 것을 찾아야 한다면 어떻게 해야 할까요?

줄 끝의 기준 문자인 달러 기호($)는 다음과 같은 작업에 도움이 됩니다.

$ echo "이것은 테스트입니다" | awk "/test$/($0 인쇄)"

줄 끝에서 텍스트 찾기

동일한 템플릿에서 두 앵커 기호를 모두 사용할 수 있습니다. 다음 정규 표현식을 사용하여 아래 그림에 내용이 표시된 myfile 파일을 처리해 보겠습니다.

$ awk "/^이것은 테스트입니다$/(print $0)" myfile


줄을 시작하고 끝내기 위해 특수 문자를 사용하는 패턴

보시다시피, 템플릿은 주어진 문자 순서 및 해당 위치와 완전히 일치하는 줄에만 응답했습니다.

앵커 문자를 사용하여 빈 줄을 필터링하는 방법은 다음과 같습니다.

$awk "!/^$/($0 인쇄)" myfile
이 템플릿에서는 부정 기호, 느낌표 - !를 사용했습니다. . 이 패턴을 사용하면 줄의 시작과 끝 사이에 아무것도 포함하지 않는 줄을 검색합니다. 느낌표이 패턴과 일치하지 않는 행만 인쇄됩니다.

도트 기호

마침표는 개행 문자를 제외한 모든 단일 문자와 일치하는 데 사용됩니다. myfile 파일을 이 정규식에 전달해 보겠습니다. 그 내용은 아래와 같습니다.

$awk "/.st/($0 인쇄)" myfile


정규식에서 점 사용하기

출력 데이터에서 볼 수 있듯이 파일의 처음 두 줄만 패턴에 해당합니다. 그 이유는 다른 문자 앞에 "st"라는 문자 시퀀스가 ​​포함되어 있고 세 번째 줄에는 적절한 시퀀스가 ​​포함되어 있지 않기 때문입니다. 네 번째에는 있지만 줄의 맨 처음에 있습니다.

캐릭터 클래스

점은 모든 단일 문자와 일치하지만, 찾고 있는 문자 세트를 보다 유연하게 제한하려면 어떻게 해야 합니까? 이런 상황에서는 문자 클래스를 사용할 수 있습니다.

이 접근 방식 덕분에 특정 세트의 모든 문자에 대한 검색을 구성할 수 있습니다. 문자 클래스를 설명하기 위해 대괄호가 사용됩니다.

$awk "/th/($0 인쇄)" myfile


정규식의 문자 클래스에 대한 설명

여기서는 "o" 문자 또는 "i" 문자 앞에 오는 일련의 "th" 문자를 찾고 있습니다.

클래스는 대문자나 소문자로 시작할 수 있는 단어를 검색할 때 유용합니다.

$ echo "이것은 테스트입니다" | awk "/그는 테스트입니다/(print $0)" $ echo "이것은 테스트입니다" | awk "/그는 테스트입니다/($0 인쇄)"

소문자 또는 대문자로 시작할 수 있는 단어 검색

문자 클래스는 문자에만 국한되지 않습니다. 여기서는 다른 기호를 사용할 수 있습니다. 어떤 상황에서 수업이 필요할지 미리 말하는 것은 불가능합니다. 이는 모두 해결되는 문제에 따라 다릅니다.

문자 클래스의 부정

위에서 설명한 반대 문제를 해결하기 위해 문자 클래스를 사용할 수도 있습니다. 즉, 클래스에 포함된 기호를 검색하는 대신 클래스에 포함되지 않은 모든 항목에 대한 검색을 구성할 수 있습니다. 이 정규식 동작을 달성하려면 클래스 문자 목록 앞에 ^ 기호를 배치해야 합니다. 다음과 같습니다.

$ awk "/[^oi]th/($0 인쇄)" myfile


클래스에 없는 문자 찾기

이 경우, "o"나 "i"가 앞에 오지 않는 일련의 "th" 문자가 발견됩니다.

문자 범위

문자 클래스에서는 대시를 사용하여 문자 범위를 설명할 수 있습니다.

$awk "/st/($0 인쇄)" myfile


문자 클래스의 문자 범위에 대한 설명

안에 이 예에서는정규식은 다음에 있는 문자 앞에 "st"라는 문자 시퀀스에 응답합니다. 알파벳 순서, 문자 "e"와 "p" 사이.

숫자로 범위를 만들 수도 있습니다.

$ 에코 "123" | awk "//" $ echo "12a" | 앗 "//"

세 개의 숫자를 찾는 정규식

문자 클래스에는 여러 범위가 포함될 수 있습니다.

$awk "/st/($0 인쇄)" myfile


여러 범위로 구성된 문자 클래스

이 정규식은 다음의 문자가 앞에 오는 "st"의 모든 시퀀스를 찾습니다. 범위 a~f그리고 m-z.

특수문자 클래스

BRE에는 정규식을 작성할 때 사용할 수 있는 특수 문자 클래스가 있습니다.
  • [[:alpha:]] - 대문자 또는 소문자로 작성된 모든 알파벳 문자와 일치합니다.
  • [[:alnum:]] - 모든 영숫자 문자, 즉 0-9 , A-Z , a-z 범위의 문자와 일치합니다.
  • [[:blank:]] - 공백 및 탭 문자와 일치합니다.
  • [[:digit:]] - 0부터 9까지의 숫자 문자.
  • [[:upper:]] - 영문 대문자 - A-Z .
  • [[:lower:]] - 알파벳 소문자 - a-z .
  • [[:print:]] - 인쇄 가능한 모든 문자와 일치합니다.
  • [[:punct:]] - 구두점과 일치합니다.
  • [[:공간:]] - 공백 문자, 특히 - 공백, 탭, 문자 NL, FF, VT, CR.
다음과 같이 템플릿에서 특수 클래스를 사용할 수 있습니다.

$ 에코 "abc" | awk "/[[:alpha:]]/($0 인쇄)" $ echo "abc" | awk "/[[:digit:]]/($0 인쇄)" $ echo "abc123" | awk "/[[:digit:]]/($0 인쇄)"


정규식의 특수 문자 클래스

별 기호

패턴의 문자 뒤에 별표를 배치하면 문자가 문자열에 없는 상황을 포함하여 문자열에 문자가 여러 번 나타나는 경우 정규식이 작동한다는 의미입니다.

$ 에코 "테스트" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/($0 인쇄)"


정규식에 * 문자 사용

이 와일드카드는 일반적으로 계속해서 철자가 틀린 단어나 다음과 같은 문제가 있는 단어에 사용됩니다. 다양한 변형올바른 철자법:

$ echo "나는 녹색을 좋아해요" | awk "/colou*r/(print $0)" $ echo "나는 녹색을 좋아합니다" | awk "/colou*r/($0 인쇄)"

철자가 다른 단어 찾기

이 예에서는 동일한 정규 표현식이 "color"라는 단어와 "color"라는 단어에 모두 응답합니다. 이는 문자 "u"와 별표가 연속해서 나타나지 않거나 여러 번 나타날 수 있기 때문입니다.

별표 기호의 또 다른 유용한 기능은 점과 결합하는 것입니다. 이 조합을 사용하면 정규식이 원하는 수의 모든 문자에 응답할 수 있습니다.

$ awk "/this.*test/(print $0)" myfile


임의 개수의 모든 문자에 응답하는 템플릿

이 경우 "this"와 "test"라는 단어 사이에 몇 개의 문자가 있고 어떤 문자가 있는지는 중요하지 않습니다.

별표는 문자 클래스에도 사용할 수 있습니다.

$ 에코 "st" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/($0 인쇄)"


문자 클래스에 별표 사용

세 가지 예 모두에서 문자 클래스 뒤의 별표는 "a" 또는 "e" 문자가 검색되거나 검색되지 않으면 문자열이 지정된 패턴과 일치한다는 의미이므로 정규식이 작동합니다.

POSIX ERE 정규식

일부 Linux 유틸리티가 지원하는 POSIX ERE 템플릿에는 추가 문자가 포함될 수 있습니다. 이미 언급했듯이 awk는 이 표준을 지원하지만 sed는 지원하지 않습니다.

여기서는 ERE 패턴에서 가장 일반적으로 사용되는 기호를 살펴보겠습니다. 이는 자신만의 정규식을 만들 때 유용합니다.

▍물음표

물음표는 앞의 문자가 텍스트에 한 번만 나타날 수도 있고 전혀 나타나지 않을 수도 있음을 나타냅니다. 이 문자는 반복 메타문자 중 하나입니다. 여기 몇 가지 예가 있어요.

$ 에코 "테트" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(print $0)" $ echo "testst" | awk "/tes?t/($0 인쇄)"


정규식의 물음표

보시다시피, 세 번째 경우 문자 "s"가 두 번 나타나므로 정규식은 "testst"라는 단어에 응답하지 않습니다.

물음표는 문자 클래스에도 사용할 수 있습니다.

$ 에코 "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(print $0)" $ echo "tast" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "teest" | awk "/t?st/($0 인쇄)"


물음표 및 문자 클래스

줄에 클래스의 문자가 없거나 그 중 하나가 한 번 발생하면 정규식이 작동하지만 단어에 두 문자가 나타나면 시스템은 더 이상 텍스트에서 패턴과 일치하는 항목을 찾지 않습니다.

▍더하기 기호

패턴의 더하기 문자는 선행 문자가 텍스트에 한 번 이상 나타나는 경우 정규식이 찾고 있는 내용과 일치함을 나타냅니다. 그러나 이 구성은 기호가 없으면 반응하지 않습니다.

$ 에코 "테스트" | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/($0 인쇄)"


정규식의 더하기 기호

이 예에서 단어에 "e" 문자가 없으면 정규식 엔진은 텍스트의 패턴과 일치하는 항목을 찾지 않습니다. 더하기 기호는 문자 클래스에서도 작동합니다. 이런 방식으로 별표 및 물음표와 유사합니다.

$ 에코 "tst" | awk "/t+st/(print $0)" $ echo "test" | awk "/t+st/(print $0)" $ echo "teast" | awk "/t+st/(print $0)" $ echo "teeast" | awk "/t+st/($0 인쇄)"


더하기 기호 및 문자 클래스

이 경우 행에 클래스의 문자가 포함되어 있으면 텍스트가 패턴과 일치하는 것으로 간주됩니다.

▍중괄호

ERE 패턴에 사용할 수 있는 중괄호는 위에서 설명한 기호와 유사하지만 이를 사용하면 앞에 나오는 기호의 필수 발생 횟수를 더 정확하게 지정할 수 있습니다. 다음 두 가지 형식으로 제한을 지정할 수 있습니다.
  • n - 검색된 정확한 발생 횟수를 지정하는 숫자
  • n, m은 "최소 n회, m 이하"로 해석되는 두 개의 숫자입니다.
첫 번째 옵션의 예는 다음과 같습니다.

$ 에코 "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/($0 인쇄)"

패턴의 중괄호, 정확한 발생 횟수 검색

이전 버전의 awk에서는 프로그램이 정규 표현식의 간격을 인식하도록 하려면 --re-interval 명령줄 옵션을 사용해야 했지만 최신 버전에서는 이것이 필요하지 않습니다.

$ 에코 "tst" | awk "/te(1,2)st/(print $0)" $ echo "test" | awk "/te(1,2)st/(print $0)" $ echo "teest" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/($0 인쇄)"


중괄호 안에 지정된 간격

이 예에서는 문자 "e"가 줄에 1~2번 나타나야 하며, 그러면 정규식이 텍스트에 응답합니다.

중괄호는 문자 클래스에도 사용할 수 있습니다. 이미 알고 있는 원칙이 여기에 적용됩니다.

$ 에코 "tst" | awk "/t(1,2)st/(print $0)" $ echo "test" | awk "/t(1,2)st/(print $0)" $ echo "teest" | awk "/t(1,2)st/(print $0)" $ echo "teeast" | awk "/t(1,2)st/($0 인쇄)"


중괄호 및 문자 클래스

템플릿은 문자 "a" 또는 문자 "e"를 한두 번 포함하는 경우 텍스트에 반응합니다.

▍논리적 “또는” 기호

기호 | - 수직 막대는 정규식에서 논리적 "또는"을 의미합니다. 이러한 기호로 구분된 여러 조각이 포함된 정규식을 처리할 때 엔진은 분석된 텍스트가 조각 중 하나와 일치하면 적합한 것으로 간주합니다. 예는 다음과 같습니다.

$ echo "이것은 테스트입니다" | awk "/test|exam/(print $0)" $ echo "이것은 시험입니다" | awk "/test|exam/(print $0)" $ echo "이것은 다른 것입니다." | awk "/test|시험/($0 인쇄)"


정규식의 논리적 "or"

이 예에서 정규식은 텍스트에서 "test" 또는 "exam"이라는 단어를 검색하도록 구성되었습니다. 템플릿 조각과 이를 구분하는 기호 사이에 | 공백이 없어야 합니다.

정규식 조각은 괄호를 사용하여 그룹화할 수 있습니다. 특정 문자 시퀀스를 그룹화하면 시스템에서 일반 문자로 인식됩니다. 즉, 예를 들어 반복 메타문자를 적용할 수 있습니다. 다음과 같이 보입니다.

$ echo "좋아요" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/($0 인쇄)"


정규식 조각 그룹화

이 예에서는 "Geeks"라는 단어가 괄호로 묶여 있고 그 뒤에 물음표가 표시됩니다. 물음표는 "0회 또는 1회 반복"을 의미하므로 정규식은 "Like" 문자열과 "LikeGeeks" 문자열 모두에 응답합니다.

실제 사례

이제 정규식의 기본 사항을 다루었으므로 정규식을 사용하여 유용한 작업을 수행할 차례입니다.

▍파일 개수 세기

변수에 기록된 디렉터리에 있는 파일 수를 계산하는 bash 스크립트를 작성해 보겠습니다. 환경 경로. 이렇게 하려면 먼저 디렉터리 경로 목록을 생성해야 합니다. sed를 사용하여 콜론을 공백으로 바꿔보겠습니다.

$ 에코 $PATH | sed "s/:/ /g"
바꾸기 명령은 텍스트 검색을 위한 패턴으로 정규식을 지원합니다. 이 경우 모든 것이 매우 간단하고 콜론 기호를 찾고 있지만 여기서 다른 것을 사용하도록 방해하는 사람은 없습니다. 모두 특정 작업에 따라 다릅니다.
이제 결과 목록을 루프로 살펴보고 파일 수를 계산하는 데 필요한 작업을 수행해야 합니다. 스크립트의 일반적인 개요는 다음과 같습니다.

$mypath의 디렉토리에 대한 Mypath=$(echo $PATH | sed "s/:/ /g") 완료
이제 ls 명령을 사용하여 각 디렉터리의 파일 수에 대한 정보를 얻는 스크립트의 전체 텍스트를 작성해 보겠습니다.

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 for $mypath do check=$(ls $directory) for item in $check do count=$ [ $count + 1 ] 완료 echo "$directory - $count" count=0 완료
스크립트를 실행할 때 PATH의 일부 디렉터리가 존재하지 않는 것으로 나타날 수 있지만 이로 인해 기존 디렉터리의 파일 수를 계산하는 데 방해가 되지는 않습니다.


파일 계산

이 예의 주요 가치는 동일한 접근 방식을 사용하면 훨씬 더 복잡한 문제를 해결할 수 있다는 것입니다. 어느 것이 귀하의 필요에 따라 정확히 달라집니다.

▍이메일 주소 확인 중

주소를 확인할 수 있는 정규식 모음이 많이 있는 웹사이트가 있습니다. 이메일, 전화 번호, 등등. 그러나 기성품을 가져가는 것과 직접 무언가를 만드는 것은 완전히 다른 것입니다. 그럼 이메일 주소를 확인하는 정규식을 작성해 보겠습니다. 소스 데이터 분석부터 시작해 보겠습니다. 예를 들어 다음은 특정 주소입니다.

[이메일 보호됨]
사용자 이름, 사용자 이름은 영숫자 및 기타 문자로 구성될 수 있습니다. 즉, 점, 대시, 밑줄, 더하기 기호입니다. 사용자 이름 뒤에는 @ 기호가 옵니다.

이러한 지식을 바탕으로 사용자 이름을 확인하는 데 사용되는 정규식을 왼쪽부터 조합해 보겠습니다. 우리가 얻은 것은 다음과 같습니다.

^(+)@
이 정규식은 다음과 같이 읽을 수 있습니다. "줄은 대괄호 안에 지정된 그룹에 있는 문자 중 하나 이상의 문자로 시작해야 하며 그 뒤에 @ 기호가 와야 합니다."

이제 - 호스트 이름 대기열 - 호스트 이름. 여기에는 사용자 이름과 동일한 규칙이 적용되므로 해당 템플릿은 다음과 같습니다.

(+)
최상위 도메인 이름에는 다음이 적용됩니다. 특별한 규칙. 알파벳 문자만 있을 수 있으며 그 중 최소 2개(예: 일반적으로 국가 코드가 포함된 도메인)가 있어야 하며 5개를 초과할 수 없습니다. 이는 주소의 마지막 부분을 확인하기 위한 템플릿이 다음과 같다는 것을 의미합니다.

\.({2,5})$
다음과 같이 읽을 수 있습니다: "먼저 마침표가 있어야 하고 그 다음에는 2~5개의 알파벳 문자가 있어야 하며 그 다음에는 줄이 끝나야 합니다."

정규식의 개별 부분에 대한 템플릿을 준비한 후 함께 정리하겠습니다.

^(+)@(+)\.({2,5})$
이제 남은 것은 무슨 일이 일어났는지 테스트하는 것뿐입니다.

$ 에코 " [이메일 보호됨]" | awk "/^(+)@(+)\.((2,5))$/(print $0)" $ echo " [이메일 보호됨]" | awk "/^(+)@(+)\.((2,5))$/($0 인쇄)"


정규식을 사용하여 이메일 주소 유효성 검사

awk에 전달된 텍스트가 화면에 표시된다는 것은 시스템이 이를 이메일 주소로 인식했다는 의미입니다.

결과

기사의 시작 부분에서 접한 이메일 주소를 확인하는 정규 표현식이 완전히 이해하기 어려운 것처럼 보였다면 이제 더 이상 의미 없는 문자 집합처럼 보이지 않기를 바랍니다. 정말 그렇다면 이런 뜻이다. 이 자료그 목적을 달성했습니다. 실제로 정규식은 평생 공부할 수 있는 주제이지만, 우리가 다룬 작은 내용이라도 상당히 고급 수준의 텍스트를 처리하는 스크립트를 작성하는 데 이미 도움이 될 수 있습니다.

이 일련의 자료에서 우리는 일반적으로 매우 간단한 예문자 그대로 여러 줄로 구성된 bash 스크립트. 다음번에는 더 큰 것을 살펴보겠습니다.

친애하는 독자 여러분! 명령줄 스크립트에서 텍스트를 처리할 때 정규식을 사용합니까?

가장 유용하고 기능이 풍부한 팀 중 하나 리눅스 터미널– "grep" 명령. Grep은 "전역 정규식 인쇄"(즉, "정규식과 일치하는 문자열을 어디서나 검색하여 인쇄")를 의미하는 약어입니다. 이는 입력이 지정된 패턴과 일치하는지 확인하는 데 grep을 사용할 수 있음을 의미합니다.

사소해 보이는 이 프로그램은 올바르게 사용하면 매우 강력합니다. 복잡한 규칙에 따라 입력을 정렬하는 기능으로 인해 많은 명령 체인에서 널리 사용되는 링크입니다.

이 튜토리얼에서는 grep 명령의 기능 중 일부를 살펴본 다음 정규식을 사용하는 방법으로 넘어갑니다. 에 설명된 모든 내용 이 설명서기술은 가상 서버 관리에 적용될 수 있습니다.

사용의 기본

가장 간단한 형태로 grep은 텍스트 파일에서 일치하는 문자 패턴을 찾는 데 사용됩니다. 이는 grep에 검색어가 주어지면 해당 단어가 포함된 파일의 모든 줄을 인쇄한다는 의미입니다.

예를 들어, grep을 사용하여 Ubuntu 시스템의 GNU General Public License 버전 3에서 "GNU"라는 단어가 포함된 줄을 찾을 수 있습니다.

CD /usr/share/공통 라이센스
grep "GNU" GPL-3
GNU 일반 공중 라이선스





13. GNU Affero 일반 공중 라이선스와 함께 사용하세요.
GNU Affero General Public License 버전 3에 따라 단일 버전으로
...
...

첫 번째 인수 "GNU"는 검색할 패턴이고 두 번째 인수 "GPL-3"은 찾을 입력 파일입니다.

결과적으로 텍스트 패턴을 포함하는 모든 줄이 출력됩니다. 일부에서는 리눅스 배포판찾고 있는 패턴이 출력 라인에서 강조 표시됩니다.

일반 옵션

기본적으로 grep 명령은 입력 파일에서 엄격하게 지정된 패턴을 검색하고 찾은 행을 인쇄합니다. 그러나 몇 가지 추가 플래그를 추가하여 grep의 동작을 변경할 수 있습니다.

검색 매개변수의 대소문자를 무시하고 패턴의 대문자 및 소문자 변형을 모두 검색해야 하는 경우 "-i" 또는 "--ignore-case" 유틸리티를 사용할 수 있습니다.

예를 들어, grep을 사용하여 동일한 파일에서 대문자, 소문자 또는 대소문자 혼합으로 작성된 "license"라는 단어를 검색할 수 있습니다.

grep -i "라이센스" GPL-3
GNU 일반 공중 라이선스
그러나 이를 변경할 수는 없습니다.
GNU General Public License는 무료 카피레프트 라이센스입니다.
대부분의 소프트웨어 및 기타 실제 저작물에 대한 라이선스는
GNU General Public License는 귀하의 자유를 보장하기 위한 것입니다.
당사 소프트웨어 대부분에 대한 GNU 일반 공중 사용 허가서(GNU General Public License) 그것은 또한 적용됩니다


"본 라이센스"는 GNU General Public License 버전 3을 의미합니다.
"프로그램"은 본 계약에 따라 라이센스가 부여된 모든 저작권 저작물을 의미합니다.
...
...

보시다시피 출력에는 "LICENSE", "license" 및 "License"가 포함됩니다. 파일에 "LiCeNsE" 인스턴스가 있는 경우에도 출력됩니다.
지정된 패턴을 포함하지 않는 모든 행을 찾아야 하는 경우 "-v" 또는 "--invert-match" 플래그를 사용할 수 있습니다.

예를 들어, 다음 명령을 사용하여 "the"라는 단어가 포함되지 않은 모든 행에 대한 BSD 라이센스를 검색할 수 있습니다.

grep -v "the" BSD
판권 소유.
유무에 관계없이 소스 및 바이너리 형식으로 재배포 및 사용
충족됨:
이 소프트웨어에서 파생된 제품을 보증하거나 홍보하는 데 사용될 수 있습니다.
구체적인 사전 서면 허가 없이.
이 소프트웨어는 리전트 및 기여자에 의해 "있는 그대로"" 제공되며
다음을 포함하되 이에 국한되지 않는 모든 명시적 또는 묵시적 보증
...
...

보시다시피, 마지막 두 줄은 "ignore case" 명령이 사용되지 않았기 때문에 "the"라는 단어가 포함되지 않은 것으로 출력되었습니다.

일치하는 항목이 발견된 줄 번호를 아는 것은 항상 유용합니다. "-n" 또는 "--line-number" 플래그를 사용하여 찾을 수 있습니다.

이전 예에서 이 플래그를 적용하면 다음 결과가 표시됩니다.

grep -vn "the" BSD
2: 모든 권리 보유.
3:
4: 소스 및 바이너리 형식의 재배포 및 사용(유무에 관계없음)
6: 충족:
13: 이 소프트웨어에서 파생된 제품을 보증하거나 홍보하는 데 사용될 수 있습니다.
14: 구체적인 사전 서면 허가 없이.
15:
16: 이 소프트웨어는 섭정 및 기여자에 의해 "있는 그대로" 제공됩니다.
17: 다음을 포함하되 이에 국한되지 않는 모든 명시적 또는 묵시적 보증
...
...

이제 "the"가 포함되지 않은 각 줄을 변경해야 할 때 줄 번호를 참조할 수 있습니다.

정규 표현식

소개에서 언급했듯이 grep은 "전역 정규식 인쇄"를 나타냅니다. 정규식은 특정 검색 패턴을 설명하는 텍스트 문자열입니다.

다양한 응용 프로그램과 프로그래밍 언어는 정규식을 약간 다르게 사용합니다. 이 튜토리얼에서는 Grep의 패턴을 설명하는 방법 중 일부만 다룹니다.

문자 일치

"GNU"와 "the"라는 단어를 검색하는 위의 예에서는 문자열 "GNU"와 "the"와 정확히 일치하는 매우 간단한 정규식을 찾았습니다.

단어의 일치보다는 문자열의 일치로 생각하는 것이 더 정확합니다. 좀 더 복잡한 패턴에 익숙해지면 이러한 구별이 더욱 중요해집니다.

주어진 문자와 정확히 일치하는 패턴은 문자별로, 문자별로 패턴과 일치하기 때문에 "문자" 패턴이라고 합니다.

모든 알파벳 및 숫자(및 기타 일부 문자)는 다른 표현 메커니즘에 의해 수정되지 않는 한 문자 그대로 일치합니다.

앵커 매치

앵커는 원하는 일치 문자열의 위치를 ​​나타내는 특수 문자입니다.

예를 들어, 맨 처음에 "GNU"라는 단어가 포함된 행만 검색하도록 지정할 수 있습니다. 이렇게 하려면 문자열 앞에 앵커 "^"를 사용해야 합니다.

이 예에서는 시작 부분에 "GNU"라는 단어가 포함된 행만 인쇄합니다.

grep "^GNU" GPL-3
당사 소프트웨어 대부분에 대한 GNU 일반 공중 사용 허가서(GNU General Public License) 그것은 또한 적용됩니다
GNU General Public License, 지금까지 출판된 모든 버전을 선택할 수 있습니다.

마찬가지로 리터럴 문자열 뒤에 앵커 "$"를 사용하여 검색 중인 문자열이 텍스트 문자열 끝에 있는 경우에만 일치 항목이 유효함을 나타낼 수 있습니다.

다음 정규식은 끝에 "and"가 포함된 줄만 인쇄합니다.

grep "and$" GPL-3
이 무료 소프트웨어에는 보증이 없습니다. 두 사용자 모두에게" 및
복사, 배포 및 배포에 대한 정확한 이용 약관


대체는 가끔, 비상업적 목적으로만 허용됩니다.
수정 자체가 실질적이고 중대한 경우에는 네트워크가 거부될 수 있습니다.
네트워크 운영에 부정적인 영향을 미치거나 규칙을 위반하는 행위
잠정적으로, 저작권 소유자가 명시적으로 그리고 그 때까지
원래 라이센스 제공자로부터 라이센스를 받아 실행, 수정 및
제작, 사용, 판매, 판매 제안, 수입 및 기타 운영, 수정 및

임의의 문자와 일치

마침표(.)는 정규식에서 모든 문자가 지정된 위치에 나타날 수 있음을 나타내는 데 사용됩니다.

예를 들어 두 문자와 "cept" 시퀀스가 ​​포함된 일치 항목을 찾으려면 다음 패턴을 사용합니다.

grep "..cept" GPL-3
사용은 정확히 가장 용납할 수 없는 부분입니다. 그러므로 우리는
적용 가능한 저작권법에 따른 침해. 단,
사용자에게 작업에 대한 보증이 없음을 알립니다(해당 작업을 제외함).

별도로 작성된 라이센스 형태 또는 예외로 명시된 경우;
귀하는 명시적으로 명시한 경우를 제외하고 해당 저작물을 전파하거나 수정할 수 없습니다.
9. 사본 보유에는 동의가 필요하지 않습니다.
...
...

보시다시피, 결과에는 "accept" 및 "exclude"라는 단어와 이러한 단어의 변형이 포함됩니다. 패턴은 텍스트에 있는 경우 "z2cept" 시퀀스와도 일치합니다.

괄호 안의 표현

대괄호("") 안에 문자 그룹을 배치하면 대괄호 안의 모든 문자가 해당 위치에 나타날 수 있음을 나타낼 수 있습니다.

즉, "too" 또는 "two"가 포함된 문자열을 찾아야 하는 경우 다음 패턴을 사용하여 이러한 변형을 간략하게 나타낼 수 있습니다.

grep "to" GPL-3
귀하의 프로그램도 마찬가지입니다.

GNU GPL을 사용하는 개발자는 다음 두 단계를 통해 귀하의 권리를 보호합니다.
복사본이 전송되지 않는 컴퓨터 네트워크는 전달되지 않습니다.

네트워크 서버의 해당 소스를 무료로 제공합니다.
...
...

보시다시피 두 변형이 모두 파일에서 발견되었습니다.

괄호 안에 문자를 넣으면 몇 가지 유용한 기능도 제공됩니다. 괄호 안의 문자 목록을 "^" 문자로 시작하여 괄호 안의 문자를 제외한 모든 항목이 패턴과 일치함을 나타낼 수 있습니다.

이 예에서는 "code" 시퀀스와 일치해서는 안 되는 ".ode" 패턴을 사용합니다.

grep "[^c]ode" GPL-3
1. 소스 코드.
모델, 개체 코드를 소유한 사람에게 다음 중 하나를 제공합니다. (1)
제품의 유일한 중요한 사용 방식입니다.
대화형 모드에서 시작하면 다음과 같습니다.

두 번째 줄 출력에 "code"라는 단어가 포함되어 있다는 점은 주목할 가치가 있습니다. 이것은 정규식이나 grep 오류가 아닙니다.

오히려 이 줄은 "model"이라는 단어에 있는 패턴 일치 시퀀스 "mode"도 포함하고 있기 때문에 인쇄되었습니다. 즉, 문자열이 패턴과 일치했기 때문에 인쇄되었습니다.

다른 것 유용한 기능대괄호 - 각 문자를 별도로 입력하는 대신 문자 범위를 지정하는 기능입니다.

즉, 대문자로 시작하는 모든 줄을 찾아야 하는 경우 다음 패턴을 사용할 수 있습니다.

grep "^" GPL-3
당사 소프트웨어 대부분에 대한 GNU 일반 공중 사용 허가서(GNU General Public License) 그것은 또한 적용됩니다

특허. 각 라이센스 사용자는 "귀하"로 지칭됩니다. "라이센스" 및


시스템 라이브러리 또는 범용 도구 또는 일반적으로 무료로 사용 가능
원천.

...
...

일부 고유한 데이터 정렬 문제로 인해 보다 정확한 결과를 얻으려면 위 예제에서 사용된 문자 범위 대신 POSIX 문자 클래스를 사용하는 것이 좋습니다.
이 매뉴얼에서 다루지 않은 많은 문자 클래스가 있습니다. 예를 들어 위의 예와 동일한 절차를 수행하려면 괄호 안에 문자 클래스 "[:upper:]"를 사용할 수 있습니다.

grep "^[[:upper:]]" GPL-3
당사 소프트웨어 대부분에 대한 GNU 일반 공중 사용 허가서(GNU General Public License) 그것은 또한 적용됩니다
국가는 특허가 다음의 개발과 사용을 제한하는 것을 허용해서는 안 됩니다.
특허. 각 라이센스 사용자는 "귀하"로 지칭됩니다. "라이센스" 및
구성 요소 및 (b) 해당 저작물의 사용을 가능하게 하는 역할만 합니다.
주요 구성 요소 또는 표준 인터페이스를 구현하기 위해
시스템 라이브러리 또는 범용 도구 또는 일반적으로 무료로 사용 가능
원천.
사용자 제품은 영구적으로 또는 일정 기간 동안 수령인에게 이전됩니다.
...
...

패턴 반복(0회 이상)

가장 일반적으로 사용되는 메타 문자 중 하나는 "이전 문자나 표현식을 0회 이상 반복"을 의미하는 "*" 기호입니다.

예를 들어, 여는 괄호나 닫는 괄호 사이에 문자와 공백 하나만 포함된 모든 줄을 찾으려면 다음 식을 사용할 수 있습니다.

grep "(*)" GPL-3

(수정 여부에 관계없이) 배포, 다음 사용자에게 제공
작품 전체보다 (a) 일반적인 형식에 포함되는 것
구성 요소 및 (b) 해당 저작물의 사용을 가능하게 하는 역할만 합니다.
(있는 경우) 실행 가능한 작업이 실행되는 곳 또는 다음을 수행하는 데 사용되는 컴파일러
(물리적 유통 매체 포함)
(물리적 배포 매체 포함)
(무료 또는 유료) 장소에 대한 동등한 액세스를 제공합니다.
...
...

메타문자를 피하는 방법

때로는 문자 그대로 마침표나 문자 그대로 여는 괄호를 찾아야 할 수도 있습니다. 이러한 문자는 정규식에서 특정 의미를 갖기 때문에 grep에 이 경우 특별한 의미가 필요하지 않음을 알려 문자를 "이스케이프"해야 합니다.

이러한 문자는 일반적으로 특별한 의미를 갖는 문자 앞에 백슬래시(\)를 사용하여 이스케이프할 수 있습니다.

예를 들어 대문자로 시작하고 마침표로 끝나는 문자열을 찾으려면 아래 표현식을 사용하면 됩니다. 마지막 점 앞의 백슬래시는 명령에 "이스케이프"를 지시하므로 마지막 점은 문자 그대로의 점을 나타내고 "모든 문자"를 의미하지 않습니다.

grep "^.*\.$" GPL-3
원천.
하나 이상의 조건에서 예외를 적용하여 라이선스를 부여합니다.
라이센스는 프로그램 전달을 완전히 금지하는 것입니다.
필요한 모든 서비스, 수리 또는 수정.
그러한 손해.
또한 전자 메일과 종이 메일로 귀하에게 연락하는 방법에 대한 정보도 추가하십시오.

고급 정규식

Grep 명령은 -E 플래그를 사용하거나 grep 대신 egrep 명령을 호출하여 확장 정규식 언어와 함께 사용할 수도 있습니다.

이 명령을 사용하면 "확장 정규식" 기능이 열립니다. 확장 정규식에는 모든 기본 메타 문자는 물론 더 복잡한 일치 항목을 표현하기 위한 추가 메타 문자도 포함됩니다.

그룹화

확장 정규식이 제공하는 가장 간단하고 유용한 기능 중 하나는 표현식을 그룹화하여 단일 단위로 사용하는 기능입니다.

괄호는 표현식을 그룹화하는 데 사용됩니다. 확장 정규 표현식 외부에서 괄호를 사용해야 하는 경우 백슬래시를 사용하여 "이스케이프"할 수 있습니다.

grep "\(그룹화\)" file.txt
grep -E "(그룹화)" file.txt
egrep "(그룹화)" file.txt

위의 표현은 동일합니다.

교대

대괄호가 단일 문자에 대해 서로 다른 일치 항목을 지정하는 것처럼 인터리브를 사용하면 문자열이나 표현식 세트에 대해 대체 일치 항목을 지정할 수 있습니다.

수직 막대 기호 "|"는 교대를 나타내는 데 사용됩니다. 대체는 둘 이상의 가능한 옵션 중 하나가 일치하는 것으로 간주되어야 함을 나타 내기 위해 그룹화에서 종종 사용됩니다.

이 예에서는 "GPL" 또는 "General Public License"를 찾아야 합니다.

grep -E "(GPL|일반 공중 라이선스)" GPL-3
GNU General Public License는 무료 카피레프트 라이센스입니다.
GNU General Public License는 귀하의 자유를 보장하기 위한 것입니다.
당사 소프트웨어 대부분에 대한 GNU 일반 공중 사용 허가서(GNU General Public License) 그것은 또한 적용됩니다
가격. 당사의 일반 공중 라이선스는 귀하가 다음을 보장하도록 설계되었습니다.
GNU GPL을 사용하는 개발자는 다음 두 단계를 통해 귀하의 권리를 보호합니다.
개발자와 작성자의 보호를 위해 GPL은 명확하게 설명합니다.
저자"를 위해 GPL에서는 수정된 버전을 다음과 같이 표시하도록 요구합니다.
이러한 행위를 금지하기 위해 이 버전의 GPL을 설계했습니다.
...
...

두 개 이상의 옵션 중에서 선택하려면 교대를 사용할 수 있습니다. 이렇게 하려면 나머지 옵션을 선택 그룹에 입력하고 수직 막대 기호 "|"를 사용하여 각 옵션을 구분해야 합니다.

수량자

확장 정규 표현식에는 문자가 반복되는 빈도를 나타내는 메타 문자가 있습니다. 이는 메타 문자 "*"가 이전 문자나 문자열이 0회 이상 일치함을 나타내는 것과 유사합니다.

문자를 0번 이상 일치시키려면 "?" 문자를 사용할 수 있습니다. 이전 문자 또는 일련의 문자를 본질적으로 선택 사항으로 만듭니다.

이 예에서는 "copy" 시퀀스를 옵션 그룹에 삽입하여 "copyright" 및 "right"와 일치하는 항목이 표시됩니다.

grep -E "(복사)?오른쪽" GPL-3
저작권 (C) 2007 자유 소프트웨어 재단, Inc.
귀하의 권리를 보호하려면 다른 사람이 귀하를 거부하는 것을 방지해야 합니다.
이러한 권리를 포기하거나 귀하에게 권리를 포기하도록 요청하는 것입니다. 그러므로 당신은
그들의 권리를 알고 있습니다.
GNU GPL을 사용하는 개발자는 다음 두 단계를 통해 귀하의 권리를 보호합니다.
(1) 소프트웨어에 대한 저작권을 주장하고 (2) 귀하에게 본 라이센스를 제공합니다.
"저작권"은 다른 종류의 저작물에 적용되는 저작권과 유사한 법률을 의미하기도 합니다.
...
...

"+" 문자는 표현식과 1회 이상 일치합니다. 이는 "*" 기호와 거의 유사하게 작동하지만 "+"를 사용할 경우 표현식이 최소한 1번 일치해야 합니다.

다음 표현식은 "free" 문자열과 공백이 아닌 1개 이상의 문자를 일치시킵니다.

grep -E "free[^[:space:]]+" GPL-3
GNU General Public License는 무료 카피레프트 라이센스입니다.
저작물을 공유하고 변경할 자유를 빼앗는 것입니다. 대조적으로,
GNU General Public License는 귀하의 자유를 보장하기 위한 것입니다.
우리가 자유 소프트웨어라고 말할 때, 우리는 자유를 말하는 것이지 자유를 말하는 것은 아닙니다.
무료 소프트웨어의 사본을 자유롭게 배포할 수 있습니다(및 비용을 청구함).

당신이 받은 자유. 그들도 수신을 받을 수 있는지 확인해야 합니다.
사용자의 소프트웨어 변경 자유를 보호합니다.
사용자의 자유를 보호하기 위해 필요에 따라 GPL을 준수합니다.
특허는 프로그램을 비자유로 만드는 데 사용될 수 없습니다.

반복된 일치 횟수

일치 항목이 반복되어야 하는 횟수를 지정해야 하는 경우 중괄호("( )")를 사용할 수 있습니다. 이러한 기호는 표현식 일치 항목 수의 정확한 수, 범위, 상한 및 하한을 나타내는 데 사용됩니다.

세 모음의 조합이 포함된 모든 줄을 찾으려면 다음 식을 사용할 수 있습니다.

grep -E "(3)" GPL-3
그들의 문제가 잘못 귀속되지 않도록 변경되었습니다.
이전 버전의 저자.
눈에 띄게 그리고 어떤 매체로든 수신할 수 있습니다.
이전 단락에 따라 제공하고 해당 소유권에 대한 권리를 부여합니다.
본 계약에 따른 귀하의 의무를 동시에 충족하기 위해 보장되는 작업
16~20자로 구성된 모든 단어를 찾으려면 다음 표현을 사용하세요.
grep -E "[[:alpha:]](16,20)" GPL-3
귀하가 소프트웨어 사본을 배포하는 경우 또는 다음과 같은 경우 특정 책임이 있습니다.
당신은 그것을 수정합니다: 다른 사람의 자유를 존중하는 책임.
c) 해당 자료의 출처에 대한 허위 진술을 금지합니다.

결론

많은 경우 grep 명령은 파일이나 계층 구조에서 패턴을 찾는 데 유용합니다. 파일 시스템. 시간이 많이 절약되므로 해당 매개변수와 구문을 숙지하는 것이 좋습니다.

정규식은 훨씬 더 다양하며 많은 인기 프로그램에서 사용될 수 있습니다. 예를 들어, 많은 텍스트 편집기정규식을 사용하여 텍스트를 검색하고 바꿉니다.

또한 고급 프로그래밍 언어는 정규식을 사용하여 특정 데이터 조각에 대한 절차를 실행합니다. 정규식을 사용하는 방법을 아는 것은 일반적인 컴퓨터 관련 문제를 해결할 때 유용합니다.

태그: ,

안녕하세요, 손님 여러분!

오늘 기사에서는 다음과 같은 거대한 주제를 다루고 싶습니다. 정규 표현식. 정규식(속어에서는 정규 표현식을 지칭함)이라는 주제가 한 게시물의 범위에서 광범위하다는 것은 모두가 알고 있다고 생각합니다. 그러므로 나는 간략하지만 가능한 한 명확하게 내 생각을 모아서 여러분에게 전달하려고 노력할 것입니다.

정규 표현식에는 여러 유형이 있다는 점부터 말씀드리겠습니다.

1. 전통적인 정규식(그들은 또한 기본, 기본 및 기본 정규 표현식(BRE))

  • 이러한 표현식의 구문은 더 이상 사용되지 않는 것으로 정의되었지만 그럼에도 불구하고 여전히 널리 퍼져 있으며 많은 UNIX 유틸리티에서 사용됩니다.
  • 기본 정규식에는 다음과 같은 메타 문자가 포함됩니다(해당 의미에 대한 자세한 내용은 아래 참조).
    • \( \) - ( )의 초기 버전(확장)
    • \(\) - ()의 초기 버전(확장)
    • \N, 어디 N- 1부터 9까지의 숫자
  • 이러한 메타 문자 사용의 특징:
    • 별표는 단일 문자에 해당하는 표현식 뒤에 와야 합니다. 예: *.
    • 표현 \( 차단하다\)*는 잘못된 것으로 간주되어야 합니다. 어떤 경우에는 문자열이 0개 이상 반복되는 것과 일치합니다. 차단하다. 다른 것에서는 문자열에 해당합니다. 차단하다* .
    • 문자 클래스 내에서는 특수 문자 의미가 대부분 무시됩니다. 특수한 상황들:
    • 세트에 ^ 문자를 추가하려면 세트에 먼저 배치하면 안 됩니다.
    • - 문자를 세트에 추가하려면 먼저 또는 마지막에 배치해야 합니다. 예를 들어:
      • 문자, 숫자, 빼기 및 점을 포함할 수 있는 DNS 이름 템플릿: [-0-9a-zA-Z.] ;
      • 빼기와 숫자를 제외한 모든 문자: [^-0-9] .
    • [ 또는 ] 문자를 세트에 추가하려면 먼저 세트에 배치해야 합니다. 예를 들어:
      • ], [, a 또는 b와 일치합니다.

2. 고급 정규식(그들은 확장 정규식(오히려))

  • 이러한 표현식의 구문은 다음을 제외하고 기본 표현식의 구문과 유사합니다.
    • ( ) 및 () 메타 문자에 대한 백슬래시 사용을 제거했습니다.
    • 메타 문자 앞의 백슬래시는 해당 특수 의미를 재정의합니다.
    • 이론적으로 거부됨 불규칙한설계\ N .
    • 메타 문자 + , ?를 추가했습니다. , | .

3. Perl과 호환되는 정규식(그들은 Perl 호환 정규식(PCRE))

  • POSIX ERE보다 더 풍부하고 동시에 예측 가능한 구문을 가지므로 애플리케이션에서 자주 사용됩니다.

정규 표현식 구성하다템플릿 또는 오히려 템플릿을 설정하다찾다. 템플릿은 다음과 같이 구성됩니다.~에서 규칙검색어는 다음과 같이 구성됩니다. 문자그리고 메타 문자.

검색 규칙다음에 의해 결정됩니다. 운영:

열거 |

파이프(|)유효한 옵션을 구분합니다. 즉 논리적 OR이라고 말할 수 있습니다. 예를 들어 "gray|grey"는 일치합니다. 회색또는 회색.

그룹 또는 공용체()

둥근 괄호연산자의 범위와 우선순위를 정의하는 데 사용됩니다. 예를 들어 "gray|grey"와 "gr(a|e)y"는 서로 다른 패턴이지만 둘 다 다음을 포함하는 집합을 설명합니다. 회색그리고 회색.

수량화()? * +

수량자캐릭터나 그룹이 횟수를 결정한 후 전례표현이 나올 수 있습니다.

일반적인 표현은 반복이 가능합니다. m부터 n까지.

일반적인 표현 m회 이상 반복.

일반적인 표현 n회 이하.

매끄러운n번 반복.

물음표수단 0 또는 1번, 같은 {0,1} . 예를 들어, "colou?r"은 다음과 일치합니다. 색상, 그리고 색상.

수단 0, 1 또는 임의의 숫자한 번 ( {0,} ). 예를 들어 "go*gle"은 다음과 일치합니다. 글글, Google, Google등등

을 더한수단 적어도 1한 번 ( {1,} ). 예를 들어 'go+gle'은 일치합니다. Google, Google등 (그러나 그렇지 않음 글글).

이러한 정규식의 정확한 구문은 구현에 따라 다릅니다. (즉, 기본 정규 표현식기호 ( 그리고 )- 백슬래시로 이스케이프 처리됨)

메타문자, 간단히 말해서 실제 의미, 즉 기호와 일치하지 않는 기호입니다. (점)은 점이 아니고 임의의 한 문자 등입니다. 메타문자와 그 의미를 숙지하시기 바랍니다.

. 해당 홀로모든 기호
[무엇] 준수 어떤 단일괄호 안에 있는 문자입니다. 이 경우: "-" 문자는 여는 괄호 바로 뒤나 닫는 괄호 앞에 있는 경우에만 문자 그대로 해석됩니다. 또는 [-abc]. 그렇지 않으면 문자 간격을 나타냅니다. 예를 들어 "a", "b" 또는 "c"와 일치합니다. 라틴 알파벳의 소문자에 해당합니다. 이러한 지정은 결합될 수 있습니다: a, b, c, q, r, s, t, u, v, w, x, y, z와 일치합니다. "[" 또는 "]" 문자를 일치시키려면 닫는 괄호는 여는 문자 뒤의 첫 번째 문자입니다. "]", "[", "a" 또는 "b"와 일치합니다. 대괄호 안의 값 앞에 ^ 문자가 오면 표현식의 값은 다음과 일치합니다. 단일 문자그 중에서 괄호 안에 있지 않은 것. 예를 들어, [^abc]는 "a", "b" 또는 "c" 이외의 모든 문자와 일치합니다. [^a-z]는 라틴 알파벳의 소문자를 제외한 모든 문자와 일치합니다.
^ 텍스트의 시작 부분(또는 모드가 한 줄씩인 경우 모든 줄의 시작 부분)과 일치합니다.
$ 텍스트의 끝(또는 모드가 한 줄씩인 경우 모든 줄의 끝)과 일치합니다.
\(\) 또는 () 나중에 사용할 수 있는 "표시된 하위 표현식"(그룹화된 표현식)을 선언합니다(다음 요소 참조: \ N). "표시된 하위 표현식"도 "블록"입니다. 다른 연산자와 달리 이 연산자(기존 구문)에는 백슬래시가 필요합니다. 확장 및 Perl에서는 \ 문자가 필요하지 않습니다.
\N 어디 N- 1부터 9까지의 숫자입니다. 해당 N번째로 표시된 하위 표현식(예: (abcd)\0, 즉 abcd 문자는 0으로 표시됨) 이 디자인은 이론적으로 불규칙한, 확장 정규식 구문에서는 허용되지 않습니다.
*
  • 단일 문자와 일치하는 표현식 뒤에는 일치합니다. 또는 사본이 (이전) 표현. 예를 들어 "*"는 빈 문자열인 "x", "y", "zx", "zyx" 등과 일치합니다.
  • \N*, 어디 N 1부터 9까지의 숫자이며, 0개 이상의 일치 항목과 일치합니다. N번째로 표시된 하위 표현. 예를 들어, "\(a.\)c\1*"는 "abcab" 및 "abcaba"와 일치하지만 "abcac"과는 일치하지 않습니다.

"\(" 및 "\)" 뒤에 "*"가 오는 표현식은 잘못된 것으로 간주됩니다. 경우에 따라 괄호로 묶인 문자열이 0개 이상 일치하는 경우도 있습니다. 다른 경우에는 "*" 문자가 주어지면 괄호로 묶인 표현식과 일치합니다.

\{엑스,와이\} 마지막 항목에 해당합니다 ( 다가오는) 적어도 발생하는 블록 엑스그리고 더 이상 와이한 번. 예를 들어, "a\(3,5\)"는 "aaa", "aaaa" 또는 "aaaaa"와 일치합니다. 다른 연산자와 달리 이 연산자(기존 구문)에는 백슬래시가 필요합니다.
.* 정규식의 두 부분 사이에 있는 임의 개수의 문자를 지정합니다.

메타문자는 다양한 일치 항목을 사용하는 데 도움이 됩니다. 그런데 어떻게 메타 문자를 일반 문자, 즉 대괄호의 의미를 지닌 [(대괄호) 기호로 표현할 수 있을까요? 단지:

  • 앞에 와야 합니다( 방패) 메타문자(. * + \ ? ( )) 백슬래시. 예를 들어 \. 또는 \[

일부 문자 세트의 정의를 단순화하기 위해 소위 문자 세트로 결합되었습니다. 클래스와 캐릭터 카테고리. POSIX는 다음 표와 같이 특정 문자 클래스 및 범주의 선언을 표준화했습니다.

POSIX 클래스 비슷하게 지정
[:높은:] 대문자
[:낮추다:] 소문자
[:알파:] 대문자와 소문자
[:알넘버:] 숫자, 대문자, 소문자
[:숫자:] 숫자
[:x자리:] 16진수
[:구두점:] [.,!?:…] 문장 부호
[:공백:] [\티] 공백과 TAB
[:공간:] [\t\n\r\f\v] 문자 건너뛰기
[:컨트롤:] 제어 문자
[:그래프:] [^\t\n\r\f\v] 인감 기호
[:인쇄:] [^\t\n\r\f\v] 봉인 기호 및 건너뛰기 기호

정규식에는 다음과 같은 것이 있습니다.

탐욕 정규식

가능한 한 명확하게 설명하려고 노력하겠습니다. 우리가 모든 것을 찾고 싶다고 가정 해 봅시다 HTML 태그어떤 텍스트에서. 문제를 지역화한 후, 우리는 사이에 포함된 값을 찾고 싶습니다.< и >, 동일한 괄호와 함께. 그러나 우리는 태그의 길이가 다르고 태그 자체가 최소 50개 이상이라는 것을 알고 있습니다. 태그를 모두 나열하고 메타 기호로 묶는 것은 너무 노동 집약적인 작업입니다. 그러나 우리는 줄에 있는 모든 문자의 수를 나타내는 표현식.*(점 별표)이 있다는 것을 알고 있습니다. 사용하여 주어진 표현우리는 텍스트에서 찾으려고 노력할 것입니다 (

그래서, 만드는 방법 RAID 레벨 LSI MegaRAID 컨트롤러의 10/50(관련 항목: Intel SRCU42x, Intel SRCS16):

) 사이의 모든 값< и >. 결과적으로 전체 행이 이 표현식과 일치합니다. 왜, 정규식은 GREEDY이고 사이의 모든 문자를 캡처하려고 시도하기 때문입니다.< и >, 각각 전체 라인을 시작합니다. < 피>그럼...그리고 결말 ...> 이 규칙에 속할 것입니다!

이 예를 통해 탐욕이 무엇인지 분명히 알 수 있기를 바랍니다. 이러한 욕심을 없애기 위해서는 다음과 같은 방법을 따라갈 수 있습니다.

  • 기호를 고려하십시오 아니다원하는 패턴에 해당합니다(예:<[^>]*> 위의 경우)
  • non-greedy로 수량자의 정의를 추가하여 탐욕을 제거합니다.
    • *? - "탐욕스럽지 않음"("게으른")과 동일 *
    • +? - "욕심 없음"("게으른")과 동일 +
    • (N,)? - "탐욕스럽지 않음"("게으른")과 동일함(n,)
    • .*? - "욕심 없음"("게으른")과 동일합니다.*

위의 모든 내용에 추가하고 싶습니다. 확장된 정규식 구문:

POSIX의 정규식은 전통적인 Unix 구문과 유사하지만 일부 메타 문자가 추가됩니다.

을 더한것을 나타냅니다 이전의기호 또는 그룹반복될 수도 있다 한 번 이상. 별표와 달리 적어도 한 번은 반복해야 합니다.

물음표하다 이전의기호 또는 그룹은 선택 사항입니다. 즉, 해당 줄에 없을 수도 있고 존재할 수도 있음매끄러운 하나한 번.

수직 막대나누다 대체 옵션정규식. 한 문자는 두 가지 대안을 지정하지만 더 많은 대안이 있을 수 있으므로 더 많은 수직 막대를 사용하면 됩니다. 이 연산자는 가능한 한 많은 표현식을 사용한다는 점을 기억하는 것이 중요합니다. 이러한 이유로 대체 연산자는 괄호 안에 가장 자주 사용됩니다.

백슬래시 사용도 폐지되었습니다. \(...\)는 (...)가 되고 \(...\)는 (...)이 됩니다.

게시물을 마무리하기 위해 정규식 사용에 대한 몇 가지 예를 제시하겠습니다.

$ cat text1 1 사과 2 배 3 바나나 $ grep p text1 1 사과 2 배 $ grep "pp*" text1 1 사과 2 배 $ cat text1 | grep "l\|n" 1 사과 3 바나나 $ echo -e "여기에서\n* 찾기" | grep "\*" * here $ grep "pl\?.*r" text1 # p, r이 있는 줄에 2 배가 $ grep "a.." text1 # a 다음에 최소 2개의 문자가 오는 줄 1 apple 3 바나나 $ grep "" text1 # 3 또는 p 1 apple 2 pear 3 바나나 $ echo -e "find an\n* here\nsomewhere." | grep "[.*]" * 여기 어딘가에..name]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # a 뒤에 오는 모든 줄에서 a를 A로 바꿉니다. a 또는 p 다음에 p가 옵니다. 1 Apple 2 pear 3 bAnAnA *\./ LAST WORD./g" 첫째. 마지막 단어. 이것은 마지막 단어입니다.

감사합니다, McSim!

grep은 '전역 정규식 프린터'를 나타냅니다. grep은 필요한 줄을 잘라냅니다. 텍스트 파일사용자가 지정한 텍스트가 포함되어 있습니다.

grep은 단독으로 사용하거나 스트림과 함께 사용하는 두 가지 방법으로 사용할 수 있습니다.

grep은 문자열 패턴, RegExp 정규식 패턴 또는 Perl 기반 정규식을 사용한 검색 등과 같이 지원하는 옵션이 많기 때문에 기능이 매우 광범위합니다.

그것의 다른 때문에 기능성 grep 도구에는 다음을 포함한 다양한 옵션이 있습니다. egrep(확장 GREP), fgrep(고정 GREP), pgrep(프로세스 GREP), rgrep(재귀 GREP)등. 그러나 이러한 옵션은 원래 grep과 약간의 차이가 있습니다.

grep 옵션

$ grep -V grep (GNU grep) 2.10 저작권 (C) 2011 Free Software Foundation, Inc. 라이선스 GPLv3+

grep 유틸리티에는 egrep(확장 정규식 처리 포함), fgrep($*^|()\ 기호를 리터럴로 처리, 즉 문자 그대로 처리), rgrep(재귀 검색 활성화)가 수정되었습니다.

    egrep은 grep -E와 동일합니다.

    fgrep은 grep -F와 동일합니다.

    rgrep은 grep -r과 동일합니다.

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] 제한된_regex_BRE [파일 ...]

grep 명령은 Limited_regex에 지정된 패턴과 소스 파일의 행을 일치시킵니다. 파일을 지정하지 않으면 표준 입력이 사용됩니다. 일반적으로 성공적으로 일치된 각 문자열은 표준 출력에 복사됩니다. 소스 파일이 여러 개인 경우 파일 이름은 찾은 줄 앞에 표시됩니다. grep은 간결하고 비결정적인 알고리즘을 사용합니다. 제한된 정규식(의미가 있는 문자열이 있고 제한된 영숫자 및 특수 문자 세트를 사용하는 표현식)은 템플릿으로 인식됩니다. 이는 ed의 정규 표현식과 동일한 의미를 갖습니다.

$, *, , ^, |, () 및 \ 문자를 쉘 해석에서 이스케이프하려면 constrained_regex를 작은따옴표로 묶는 것이 가장 쉽습니다.

옵션:

B 각 줄 앞에는 해당 줄이 발견된 블록 번호가 붙습니다. 이는 컨텍스트별로 블록을 검색할 때 유용할 수 있습니다(블록 번호는 0부터 시작됩니다). -c 패턴을 포함하는 행 수만 인쇄합니다. -h 일치하는 행을 포함하는 파일 이름이 행 자체 앞에 인쇄되는 것을 방지합니다. 여러 파일을 검색할 때 사용됩니다. -i 비교할 때 대소문자를 무시합니다. -l 일치하는 문자열을 포함하는 파일 이름만 한 줄에 하나씩 인쇄합니다. 파일의 여러 줄에서 패턴이 발견되면 파일 이름이 반복되지 않습니다. -n 파일의 각 줄 앞에 해당 번호를 인쇄합니다(줄 번호는 1부터 시작됩니다). -s 존재하지 않거나 읽을 수 없는 파일에 대한 메시지를 억제합니다. -v 패턴이 포함된 행을 제외한 모든 행을 인쇄합니다. -w 메타 문자로 둘러싸인 것처럼 표현식을 단어로 검색합니다.< и \>.

grep --help

사용법: grep [OPTION]... PATTERN [FILE]... 각 FILE 또는 표준 입력에서 PATTERN을 검색합니다. 기본적으로 PATTERN은 BRE(단순 정규식)입니다. 예: grep -i "hello world" menu.h main.c 정규식 유형 및 해석 선택: -E, --extended-regexp PATTERN - 확장 정규식(ERE) -F, --fixed-regexp PATTERN - 줄 바꿈으로 구분된 고정 길이의 문자열 -G, --basic-regexp PATTERN - 단순 정규 표현식(BRE) -P, --perl-regexp PATTERN - Perl 정규 표현식 -e, --regexp=PATTERN PATTERN을 사용하여 검색 - f, --file=FILE FILE에서 패턴을 가져옵니다. -i, --ignore-case 대소문자 차이를 무시합니다. -w, --word-regexp 패턴은 모든 단어와 일치해야 합니다. -x, --line-regexp 패턴은 전체 줄과 일치해야 합니다. -z , --null-data 줄은 줄 끝 문자가 아닌 널 바이트로 구분됩니다. 기타: -s, --no-messages 오류 메시지 억제 -v, --revert-match 일치하지 않는 줄 선택 -V, - -version print 버전 정보 및 종료 --help 이 도움말을 표시하고 종료 --mmap 하위 호환성, 무시됨 출력 제어: -m, --max-count=NUMBER 지정된 NUMBER 일치 후 중지 -b, --byte-offset 출력 라인과 함께 바이트 오프셋을 인쇄 -n, --line-number 라인 인쇄 출력 라인과 함께 숫자 --line-buffered 각 라인 후에 버퍼를 플러시합니다. -H, --with-filename 각 일치 항목에 대한 파일 이름을 인쇄합니다. -h, --no-filename 파일 이름으로 출력을 시작하지 않습니다 -- label=LABEL LABEL을 표준 입력의 파일 이름으로 사용 -o, --only-matching PATTERN과 일치하는 행의 일부만 표시 -q, --quiet, --silent 모든 일반 출력 억제 --binary-files=TYPE 가정 저것 바이너리 파일유형은 바이너리, 텍스트 또는 일치하지 않음입니다. -a, --text --binary-files=text와 동일 -I --binary-files=without-match와 동일 -d, --directories=ACTION 디렉토리 처리 방법 ACTION을 읽을 수 있음 ), 반복(재귀적으로) 또는 건너뛰기(건너뛰기). -D, --devices=ACTION 장치, FIFO 및 소켓 처리 방법 ACTION을 읽거나 건너뛸 수 있습니다. -R, -r, --recursive --directories=recurse와 동일 --include=F_PATTERN F_TEMPLATE에서 일치하는 파일만 처리 - -exclude=F_TEMPLATE F_TEMPLATE와 일치하는 파일 및 디렉터리 건너뛰기 --exclude-from=FILE FILE의 템플릿 파일과 일치하는 파일 건너뛰기 --exclude-dir=PATTERN과 일치하는 TEMPLATE 디렉터리를 건너뜁니다. -L, - -files-without-match 인쇄만 일치하지 않는 FILE 이름 -l, --files-with-matches 일치하는 FILE 이름만 인쇄 -c, --count FILE당 일치하는 줄 수만 인쇄 -T, --initial-tab 정렬 탭(필요한 경우) - Z, --null FILE 이름 뒤에 바이트 0을 인쇄합니다. 컨텍스트 관리: -B, --before-context=NUM 이전 컨텍스트의 NUMBER 라인을 인쇄합니다. -A, --after-context=NUM FILE 이름의 NUMBER 라인을 인쇄합니다. 후속 컨텍스트 -C, --context[=NUMBER] NUMBER개의 컨텍스트 행을 인쇄합니다. -NUMBER는 --context=NUMBER와 동일합니다. --color[=WHEN], --colour[=WHEN] 마커를 사용하여 일치 여부를 구별합니다. 윤곽; WHEN은 항상, 절대 또는 자동일 수 있습니다. -U, --binary 줄 끝에서 CR 문자를 제거하지 않습니다(MSDOS) -u, --unix-byte-offsets는 마치 CR-s가 없는 것처럼 오프셋을 표시합니다(MSDOS ) "egrep" 대신 "grep -E"를 실행해야 합니다. "fgrep" 대신 "grep -F"가 사용됩니다. "egrep" 또는 "fgrep"으로 실행하지 않는 것이 좋습니다. FILE이 지정되지 않거나 FILE이 -이면 표준 입력을 읽습니다. 두 개 미만의 파일이 지정되면 -h가 가정됩니다. 일치하는 항목이 발견되면 종료 코드는 0이 되고 그렇지 않으면 1이 됩니다. 오류가 발생하거나 -q 옵션이 지정되지 않은 경우 종료 코드는 2가 됩니다. 오류를 다음 주소로 보고하십시오. 번역 오류를 다음 주소로 보고해 주세요. GNU Grep 홈페이지: GNU 프로그램 작업에 대한 도움말: