查找 FROM 和 WHERE 单词之间的所有内容(不包括单词本身),模式可以多次出现

查找 FROM 和 WHERE 单词之间的所有内容(不包括单词本身),模式可以多次出现

我需要从文件中提取 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

使用 GNU awk 进行各种扩展(IGNORECASE\s\<\>、 multi-charRSgensub()):

$ 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

怎么样....与gawk

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

相关内容