sed+awk模拟简单sql查询(26天)

经常需要用sqlplus去查询一些数据字典类型的数据,这些数据量不大,而且需要环境之间都是一样的,所以就想使用离线查询的方式,把那些数据以平面文件的形式存放,然后通过系统级的操作来输出。以下使用 sed 和awk来实现。还有很多很多需要改进的地方,就当做是抛砖引用了

1.数据量极小的行级筛选

.....

echo 'MODU CC_VERSION           MODULE_VERSION       PROJ_NAME
---- -------------------- -------------------- ------------------------------'
data_path=`pwd`/data
data_file=${data_path}/ccmodule.data   --数据通过sqlplus spool 到这个文件中
sed -n "/$1/p"  $data_file|uniq

输出结果如下:

MODU CC_VERSION           MODULE_VERSION       DEV_PATH
---- -------------------- -------------------- ------------------------------
MO1        550                                   550                 devpath1
MO2        550                                   550                  devpath2
MO3        550                                   550                  devpath3
MO4        550                                   550                  devpath4

--因为这个数据量极小,而且数据行内的数据分布很有规律,所以我用了sed做了行级操作

2.多重查询条件

类似数据库查询中的 and or条件

......
cc_module=`echo $2|tr [[:lower:]] [[:upper:]]`
data_path=`pwd`/data
data_file=${data_path}/ccobj.data  --数据通过sqlplus spool 到这个文件中
echo 'MODU OBJECT OBJECT_NAME                    DB_AREA_CODE    VERSION
---- ------ ------------------------------ --------------- --------------------'
cat  $data_file |awk '
BEGIN{
cc_version="'$1'"
cc_module="'$cc_module'"
cc_index=1
}
{
if ($1== cc_module && $5 == cc_version)    --组合查询条件,and/or。。。
{
print cc_index,$0
cc_index=cc_index+1
}
}'
--查询结果如下
MODU OBJECT OBJECT_NAME                    DB_AREA_CODE    VERSION
---- ------ ------------------------------ --------------- --------------------
1 MO1  app       MO1_TAB1                          DB_AREA1                       550
2 MO1   app      MO1_TAB2                          DB_AREA2                        550

3.动态模糊匹配

类似数据中的Like 匹配

.......
obj_name=`echo $2|tr [[:lower:]] [[:upper:]]`
data_path=`pwd`/data
data_file=${data_path}/ccobj.data
echo 'MODU OBJECT OBJECT_NAME                    DB_AREA_CODE    VERSION
---- ------ ------------------------------ --------------- --------------------'
cat  $data_file |awk '
BEGIN{
cc_version="'$1'"
obj_name="'$obj_name'"
cc_index=1
}
{
if ($3~obj_name && $5 == cc_version)  --动态模糊匹配
{
print cc_index,$0
cc_index=cc_index+1
}
}'

输出结果如下:

MODU OBJECT OBJECT_NAME                    DB_AREA_CODE    VERSION
---- ------ ------------------------------ --------------- --------------------
1 MO1 DUMMY  MO1_TAB1                           DUMMY                         550
2 MO2 DUMMY  MO1_TAB2                           DUMMY                         550

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

ORA-00932: inconsistent datatypes: expected - got CLOB

      最近数据库从10.2.0.3升级到了10.2.0.5之后,一些对象无法编译通过。查看了这些对象主要表现在之前写法不严格的SQL语法导致了这些pack...

1643
来自专栏乐沙弥的世界

Oracle ROWID

  ROWID 是一个类似于rownum的伪列,用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即 被确定且唯一。而...

1634
来自专栏数据库新发现

如何使用USE_CONCAT提示

USE_CONCAT提示强迫优化器扩展查询中的每一个OR谓词为独立的查询块. 最后合并所有查询块的结果,返回结果集给用户。

1342
来自专栏数据和云

殊途同归:如何获得一个SQL的真实执行计划

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 如何查看一个sql的真实执行计划呢?用dbms_xplan.displ...

2843
来自专栏分布式系统和大数据处理

Hive中分区和分桶的概念和操作

在使用传统的RDBMS数据库(关系数据库),例如MySql时,对于一些大表,我们通常会进行分表操作,以提升查询效率。在Hive中也提供了类似的概念和操作,本文将...

1901
来自专栏大内老A

谈谈基于SQL Server 的Exception Handling[中篇]

三、TRY CATCH & Return 在上面一节中,我通过RAISERROR重写了创建User的Stored procedure,实际上上面的Stored ...

1886
来自专栏乐沙弥的世界

使用 EXPLAIN PLAN 获取SQL语句执行计划

     SQL查询语句的性能从一定程度上影响整个数据库的性能。很多情况下,数据库性能的低下差不多都是不良SQL语句所引起。而SQL语句的执行 计划则决定了S...

1215
来自专栏乐沙弥的世界

PL/SQL 包编译时hang住的处理

       最近PL/SQL包在编译时被hang住,起初以为是所依赖的对象被锁住。结果出乎意料之外。下面直接看代码演示。

946
来自专栏乐沙弥的世界

SQLplus 下行预取特性

   通常情况下数据库引擎每访问一个数据块将产生至少一个逻辑读。而行预取与逻辑读息息相关。行预取是指当客户端从数据库获取数据时 可以采用单行也可以采用多行方式返...

732
来自专栏数据和云

极限优化:从75到2000,由技能到性能提升岂止80倍

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracl...

2865

扫码关注云+社区

领取腾讯云代金券