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
전체 일치 항목이 반환되므로 이는 여전히 필요한 것이 아닙니다.철사일치하는 선의 부분만이 아닙니다.
grep
GNU (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