2017-12-26 7 views
1

나는 SQL 로그 파일을 잔뜩 가지고있다. 나는 다음과 같은 패턴의 모든 항목을 추출하기 위해 찾고 있어요문자열 추출 및 dupes 필터링 맥 OS X

SQL 로그 내가 logs_로 시작하는 파일을 검색하고 다음에 고유 한 모든 테이블을 추출 할이

sel * 
from DB.T1; 
update DB.T1; 
delete from DB.T2; 
collect stats on 
DB.T3 index (a,b,c); 
sel count(*) from Db.T1; 
sel count(*) from db . T2; 
sel count(*) from db.t2; 

같이 보입니다 SQL을 가지고 문자열 DB./db./Db./dB. 몇 가지 경우

에서 DB 후 공백이 당신이 볼 수 있듯이

내가 기대하고있어 출력은 T3

내가는 Mac OS X에있어

deduped 목록 T1, T2입니다

이것이 내가 얻을 수 있었던 것입니다. 나는 이것을 지나갈 수 없었다

grep -o -i 'tb.*\Z' *logs_* | uniq 

이것은 공백의 결과를 준다. 나는 문자열의 끝까지 (그리고 줄의 끝까지) 원하는대로 \ Z를 사용했다.

올바른 명령을 작성하는 데 도움이 필요하다. 같은

답변

0

뭔가 : Z \

grep -E -o -i 'DB ?\. ?[A-Z0-9$_]+' | cut -d . -f 2 | tr -d ' ' | sort -u 

는 지금까지 내가 말할 수있는, 그렙에서 지원되지 않습니다. 그리고 그것을 지원하는 언어에서, 그것은 실제로 문자열의 끝까지, 문자열의 일부 "단어"의 끝이 아니라는 것을 의미합니다. 따라서 grep에서 테이블 이름을 명시 적으로 일치시켜야합니다.

-e를 사용하여 grep의 확장 정규 표현식을 사용하면 +?이 정규식 메타 문자로 인식됩니다. 이것은 꼭 필요한 것은 아닙니다. -E를 생략하고 대신 \+\?을 사용할 수 있습니다.

정규 표현식 DB ?\. ?[A-Z0-9$_]+ (또는 DB \?\. \?[A-Z0-9$_]\+ 당신이 -E 플래그를 생략 할 경우는) 일치합니다

the literal characters "DB" (case insensitively, because of -i) 
an optional space 
a literal "." 
an optional space 
one or more of any ascii letters, digits, $ or _ (the characters that can appear in an unquoted mysql table name) 

컷은 데이터베이스 이름을 제거 TR 테이블 이름 앞에 공백을 제거하고 일종의 단지를 반환 -u 고유 테이블 이름. (uniq는 그 자체로는하지 않으며 이전 줄의 중복 된 줄만 제거하므로 먼저 정렬 한 경우 원하는 것을 수행했을 것입니다.)

+0

감사합니다. sth, 명령 작동 방법을 설명해 주시겠습니까? . 이 패턴을 실행하면 패턴과 일치하지 않는 여러 행이 생기고 DBT1의 select *와 같은 완전한 행을 얻게됩니다. – pmv

+0

@pmv'-o'를 생략 했습니까? 여기 정확히 시도한 것을 보여주세요. – ysth

+0

안녕하세요. 감사. -E가하는 것과 DB '부분을 이해하도록 도와 주시겠습니까? ? [A-Z0-9 $ _] + ' – pmv