MySQL 덤프 파일이 있는데 대부분이 INSERT 문입니다. 특정 테이블의 필드에서 문자열 "media"의 인스턴스를 grep하고 +/- ~10개의 컨텍스트 문자를 포함하고 싶습니다. 문자열은 열 값에 여러 번 나타날 수 있습니다. 어떻게 해야 하나요?
소스는 매우 큰 SQL 덤프 파일입니다(간결함을 위해 엄격하게 잘라야 했습니다).
INSERT...334,'field_media_intro_image','image','image'...);
INSERT...g__vieg__view_mode__media_original attr__format....ategies that are immediately actionable for the task...);
보고 싶어요
ield_media_intr
ode__media_orig, re immediately
위의 첫 번째 줄은 첫 번째 일치 줄에 있는 문자열 "media"의 인스턴스이고 두 번째 줄은 다음 일치 줄에 있는 문자열 "media"의 두 인스턴스를 보여줍니다. 둘 다 문자열의 시작과 끝 부분에 5개의 컨텍스트 문자를 표시합니다. 쉼표는 구분 기호 역할을 합니다.
답변1
GNU grep컨텍스트는 다음 줄을 통해 얻을 수 있습니다( -A LINES
컨텍스트의 경우).뒤쪽에, -B LINES
컨텍스트용앞으로, -C LINES
그리고문맥전후), 수평 컨텍스트 플래그가 없습니다. 그러나 정규식을 사용하여 이를 수행할 수 있습니다.
grep -Eo '.{0,10}media.{0,10}'
( -E
사용확장 정규식(ERE), 유사한 구문을 허용합니다 .{0,10}
(모든 문자와 0-10번 일치). GNU grep -o
표시오직한 줄에 한 번씩 일치하는 콘텐츠입니다. )
탐욕스러운
"미디어"라는 단어의 일부 복사본이 캡처된 내용과 너무 유사할 수 있으므로 이것이 포괄적인 목록은 아니라는 점에 유의하세요. 예를 들어:
$ echo 123 media 12345 media 123456789 media 12 |grep -Eo '.{0,10}media.{0,10}'
123 media 12345 med
234567890 media 123
당신은 얻는다부분"미디어"의 세 인스턴스는 모두 있지만 한 인스턴스가 다른 인스턴스 부분과 10자 이내이므로 인스턴스의 해당 부분만 표시됩니다.
GNU grep 컴파일이 있는 경우도서관, 이러한 와일드카드가 다음과 같다는 것을 알 수 있습니다.욕심보다는 게으름:
$ echo 123 media 12345 media 123456789 media 12 |grep -Po '.{0,10}?media.{0,10}?'
123 media
12345 media
234567890 media
이 -P
플래그는Perl 호환 정규식(PCRE) 평가.
지연 평가("탐욕 없는 평가"라고도 함)는 가능한 한 10자를 소비하여 추가 일치를 제한하는 대신 하나의 일치가 다른 일치를 방해하지 않도록 방지하는 것을 목표로 합니다.
귀하의 버전이 또는 를 grep
지원하지 않는 경우 다음을 사용할 수 있습니다 .-P
-o
perl
$ echo 123 media 123 media 123456789 media 12 |perl -ne \
'while (/(.{0,10}?media.{0,10}?)/g) { print "$1\n"; }'
123 media
12345 media
234567890 media
이는 나중에 일치하는 텍스트를 참조할 수 있도록 일치 그룹을 포함하도록 정규식을 약간 수정합니다. 그렇지 않으면 각 일치 항목을 반복한 다음( g
첫 번째 일치 항목 대신 전역 일치 항목) 개행 문자로 일치 항목을 인쇄합니다.
GNU 대 POSIX grep
GNU grep많은 기능이 추가되었습니다POSIX 표준 grep. 이 답변과 관련하여 -A LINES
(컨텍스트 라인ㅏ이후), -B LINES
(컨텍스트 라인두번째이전), -C LINES
(라인씨전후 맥락), -o
(표시오일치만) 및 -P
(사용인CRE)는 GNU grep에서 사용할 수 있지만 다른 grep 구현에서는 가정할 수 없습니다. BSD grep제외하고 모두 지원 -P
됩니다 .GNU의 성능 최적화.
GNU 및 BSD grep
명령도 모두 지원되며 --color
이를 -o
.
마지막 참고 사항: 질문에 대한 의견은 에서는 작동하지 않지만 거의 모든 곳에서는 작동하지 않는 구문 .{,5}
을 사용합니다 . 에 0을 명시적으로 포함하는 대신 이 형식을 사용하는 것은 좋지 않습니다 .grep -E
grep -P
perl
.{0,5}