linux - awk 命令根据多个模式字符串提取特定字符串

标签 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 匹配;数据库也是动态的......它并不总是数据库

最佳答案

这是使用 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

关于linux - awk 命令根据多个模式字符串提取特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175549/

相关文章:

c - 为什么 wait4() 被 waitpid() 取代

bash - 在bash中按字典顺序比较两个包含 '_'的字符串

linux - 如何让我的脚本真正执行,而不是仅仅打印到控制台?

linux - 如何使用shell将字符串分割成正确的格式?

linux - Apache 文件权限

linux - 创建一个虚假的现实 : Testing Using Virtual Block Devices

linux - 在启动时启动受限制的 Node.js 应用程序

linux - 尾部最后修改的文件并监视 bash 中的新文件

linux - 将时间戳附加到 Ubuntu 中的文件名

linux - linux 排序命令的异常行为