sed+awk模擬簡單sql查詢

yuntui發表於2016-11-03
經常需要用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






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章