grep을 사용하여 정규식으로 문자열을 추출하는 방법은 무엇입니까?

grep을 사용하여 정규식으로 문자열을 추출하는 방법은 무엇입니까?

SQL.txt가 있다고 가정해 보세요.

select * from table1;
select a,b,c from table2 where a=1;

명령을 사용하여 테이블 이름을 필터링하는 방법cat SQL.txt|grep

내 예상 결과는 다음과 같습니다

table1
table2

저는 지휘를 처음 접했고 grep도움을 주시면 감사하겠습니다. 감사해요.

고쳐 쓰다

grep내가 원하는 것은 명령 에 정규식을 적용하는 방법을 아는 것입니다 .

이 경우 정규 표현식을 작성할 수 있습니다: from (.*?). 문제는 grep에서 정규식을 사용하는 방법을 모른다는 것입니다.

답변1

Grep은 패턴과 파일을 인수로 사용합니다. 설명된 대로 man grep:

GREP(1)                          User Commands                         GREP(1)

NAME
       grep, egrep, fgrep - print lines that match patterns

SYNOPSIS
       grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

DESCRIPTION
       grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.

따라서 일반적인 형식은 입니다 grep 'regex' file. 따라서 정규식 예제를 사용하려면 다음을 수행합니다.

grep 'from (.*?)' file 

grep하지만 이것은 작동 하지 않습니다.기본 정규식(BRE)는 괄호를 특수 문자1로 처리하지 않으며 탐욕 스럽지 않은(최단 일치 찾기) 연산자를 이해하지 못합니다 *?. 당신이 정말로 원하는 것은:

grep 'from [^[:blank:]]' file 

BRE 문자 클래스를 사용 [[:blank:]]하지만부정적인^( ) 와 함께 사용되어 [^[:blank:]]이제 공백이 아닌 문자와 일치합니다. 그러나 grep전체 일치 항목이 반환되므로 이는 여전히 필요한 것이 아닙니다.철사일치하는 선의 부분만이 아닙니다.

grepGNU (Linux의 기본값) 가 있는 경우 일치하는 부분만 반환하도록 -o선택할 수 있습니다.grep

$ grep -o 'from [^[:blank:]]*' file 
from table1;
from table2

물론 이것은 여전히 ​​필요한 것이 아닙니다. 추가 from, 공백 및 후행이 있습니다. ;다시 말하지만, GNU가 있다면 grep다음을 지원하는 PCRE(Perl Compatible Regular Expressions)를 사용할 수 있습니다.주위를 둘러보세요:

$ grep -oP '(?<=from )\w+' file 
table1
table2

여기서는 일치하는 부품만 반환되도록 -o지시 하고 PCRE 지원을 활성화합니다. 이것은 ... 불리운다grep-P(?<=from )활성 후면보기"이전 부분이 일치하는 경우에만 다음 부분과 일치 from"를 의미합니다. 마지막으로 "단어 문자"(문자, 숫자 및 (유니코드를 사용하는 경우 기타)) \w와 일치하는 특수 PCRE 클래스가 있습니다 . _설명된 대로 man perlre:

\w        [3]  Match a "word" character (alphanumeric plus "_", plus
               other connector punctuation chars plus Unicode
               marks)

PCRE에는 훌륭한 \K기능도 있습니다. 이는 되돌아보기와 유사하지만 기본적으로 "여기에 일치하는 항목을 무시합니다"를 의미합니다. 이를 사용하여 위의 정규식을 다음과 같이 단순화할 수 있습니다.

$ grep -oP 'from \K\w+' file 
table1
table2

답변2

파이프 없이 AWK 명령을 사용해 보았고 테스트를 거쳐 정상적으로 작동했습니다.

 awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file

산출

table1
table2

관련 정보