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

作者: admin 分类: 公众号存档            1 次浏览 发布时间: 2014-03-29 11:26

公众号:杨建荣的学习笔记 · 作者:笔记26天 · 发布:2014-03-29 11:26:36 · 原文链接

 经常需要用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

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注