awk命令基于多个模式字符串提取特定字符串

时间:2014-03-04 15:04:57

标签: linux bash shell unix awk

我在名为 ddl.txt

的文件中有以下字符串
CREATE SET TABLE DB.TABLE1 ,NO FALLBACK ,
     NO BEFORE JOURNAL (
      key DECIMAL(18,0);

drop table DB.dummy;
create table DB.dummy (id varchar(10));

我需要在上面的文件中提取表名,如下所示,其中包含关键词' TABLE' &安培; ' CREATE'但是以不同的模式,(预期输出

TABLE1
dummy

我试过的是,

a=`cat ddl.txt`
a=`echo "$a" | tr [a-z] [A-Z]`

echo "$a" | awk -v RS=, '/TABLE/&&/CREATE/{print $NF}' | awk -F'.' '{print $2}'

仅返回

TABLE1

我需要使用不同模式搜索的其他表名dummy

注意:我们总是应该检查模式是否与关键字TABLE&我在上面的查询中使用CREATE; DB也是动态的...它并不总是DB

3 个答案:

答案 0 :(得分:1)

这会有帮助吗?

$ cat t.awk
/CREATE.*TABLE/{table1=$5}
/create table/{table2=$4}
END{
    print table1
    print table2
}

$ awk -F'[ .]' -f t.awk input.txt
TABLE1
dummy

<强>更新

假设以下输入:

CREATE SET TABLE DB.TABLE1 ,NO FALLBACK ,
     NO BEFORE JOURNAL (
      key DECIMAL(18,0);

drop table DB.dummy;
create table DB.dummy (id varchar(10));

CREATE SET TABLE BD.TABLE2 ,NO FALLBACK ,
     NO BEFORE JOURNAL (
      key DECIMAL(18,0);

drop table BD.dummier;
create table BD.dummier (id varchar(10));

AWK:

/CREATE.*TABLE/{
    t1[n++] = $5
}
/create table/{
    t2[k++] = $4
}
END{
    for (i=0; i<=n; i++) {
        print t1[i], t2[i]
    }
}

输出:

$ awk -F'[ .]' -f t.awk input.txt
TABLE1 dummy
TABLE2 dummier

答案 1 :(得分:1)

如果我明白你的意思,我会这样做:

$ cat a
CREATE SET TABLE DB.TABLE1 ,NO FALLBACK ,
     NO BEFORE JOURNAL (
      key DECIMAL(18,0);

drop table DB.dummy;
create table DB.dummy (id varchar(10));

$ kw="DB." # you can set kw according to what happens previously
$ awk -F"$kw" '(($0~/table/ || $0~/TABLE/) && ($0~/create/ || $0~/CREATE/)){print $2}' a | awk '{print $1}'

 TABLE1
 dummy

我认为名字总是在&#34; DB之后。&#34;图案

答案 2 :(得分:1)

以下是GNU awk的另一种方式:

awk '
BEGIN{IGNORECASE=1}
/create/&&/table/{for(i=1;i<=NF;i++) if($i~/[.]/){split($i,tmp,/\./); print tmp[2]}}' ddl.txt

<强>输出:

TABLE1
dummy