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
. 그러나 이것은 전체 일치 항목을 반환하므로선일치하는 라인 부분뿐만 아니라.
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 지원을 활성화합니다. 는 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