SQL 명령에 대한 긴 로그 파일이 있고 테이블 이름을 파악하는 데 관심이 있습니다. 예를 들어:
SELECT * FROM table_02323
SELECT * FROM table_231
SELECT * FROM table_1
결과가 반환되도록 grep하고 싶습니다.
table_02323
table_231
table_1
내가 얻은 가장 가까운 것은 이었지만 grep -o 'table.....' this.log
분명히 접미사의 길이는 다를 것입니다. 마침표처럼 고정된 길이에 제한받지 않고 출력할 수 있는 정규식이 있습니까?
답변1
이는 "table_" 뒤에 0개 이상의 ASCII 숫자가 오는 것과 일치합니다.
grep -o 'table_[0-9]*' this.log
답변2
다음과 같이 GNU를 사용하십시오 grep
:
grep -oiP 'FROM\s*\K\w+' infile
비GNU:
grep -ioP 'FROM[ ]*\K[A-Z_0-9]+' infile
이렇게 하면 테이블 이름만 얻을 수 있습니다.
시험:
grep -ioP 'FROM\s*\K\w+' <<<"SELECT * FROM table_02323 where 1=1"
table_02323
답변3
에서 man grep
:
Repetition A regular expression may be followed by one of several repetition operators: ... * The preceding item will be matched zero or more times.
그래서 당신은 다음과 같은 것을 사용하고 싶습니다
$ grep -o 'table\w*'
\w
공백이 아닌 문자는 0번 이상 반복됩니다 .
답변4
또 다른 방법은 LookBehind를 사용하는 것입니다.
$ grep -P -o -e '(?<=^SELECT \* FROM )(.*$)' < 'file'
table_02323
table_231
table_1