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

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

SQL.txt가 있다고 가정해 보겠습니다.

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

명령을 사용하여 테이블 이름을 필터링하려면 어떻게 해야 합니까?cat SQL.txt|grep

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

table1
table2

저는 명령을 내리는 초보자입니다 grep. 도움을 주셔서 감사합니다. 감사해요.

업데이트

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

이 경우 regex: 를 작성할 수 있습니다 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 지원을 활성화합니다. 는 a라고 불린다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

관련 정보