파일에서 SQL 키워드 FROM과 WHERE 사이의 모든 내용을 추출해야 합니다. FROM과 WHERE는 다양한 방법으로 결합할 수 있습니다. 또한 대소문자를 구분하지 않고 일치해야 합니다. SQL 파일은 다음과 같습니다.
SELECT col1 as column1,
Col2 as column2,
Col3 as column3,
(SELECT t1.col4
from table_1 t1, table_3 t3
WHERE t1.col5 = t2.col6
AND t1.col2 = t3.col11
) as column4
FROM
table_2 t2,
table_4 t4
where t2.col7 ='Active'
AND t2.col12 = t4.col13
AND t2.col8 IN ('abc','def','ghi')
AND t2.col8||''||t2.col9 <> 'jkl'
AND t2.col10 IS NULL;
원하는 출력은 다음과 같아야 합니다.
table_1 t1
table_3 t3
table_2 t2
table_4 t4
다음을 시도했는데 문제가 거의 해결되었지만 "FROM"이 있는 다음 줄에 테이블 이름이 나타나면 테이블 이름이 깨지고 출력으로 인쇄되지 않습니다.
#!/bin/sh
awk '
BEGIN {IGNORECASE=1} { found = 0; }
/FROM/ {
if (!found) {
found = 1;
$0 = substr($0, index($0, "FROM") + 4);
}
}
/WHERE/ {
if (found) {
found = 2;
$0 = substr($0, 0, index($0, "WHERE") - 1);
}
}
{ if (found) {
print;
if (found == 2)
found = 0;
}
}
'
답변1
다양한 확장( IGNORECASE
, \s
, \<
, , \>
, 다중 문자 RS
및 gensub()
)과 함께 GNU awk를 사용하십시오.
$ cat tst.awk
BEGIN {
IGNORECASE = 1
RS = "\\s*\\<where\\>\\s*"
}
sub(/.*\<from\>\s*/,"") {
print gensub(/\s*,\s*/,ORS,"g")
}
$ awk -f tst.awk file
table_1 t1
table_3 t3
table_2 t2
table_4 t4
답변2
어때요....g와 함께라면awk
awk -F"from|FROM|where|WHERE" 'BEGIN{RS=""}{for (i=2;i<=NF;i+=2) print $i}' file |
tr "," "\n" | column -t
table_1 t1
table_3 t3
table_2 t2
table_4 t4
From/Where와 같은 대소문자가 혼합되어 있지 않는 한
awk -F"[fF]rom|FROM|[wW]here|WHERE"
아니면 마지막으로
awk -F"[fF][rR][oO][mM]|[wW][hH][eE][rR][eE]"
하지만 그러면 전문적인 치료를 받아야 해요
고쳐 쓰다
기본 column
구분 기호는 공백 2개입니다(페이지 참조 man
). 단지 하나의 공간을 원한다면 그냥 사용하세요
column -o" " -t