我在名为 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
答案 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