[20191101]通过zsh计算sql语句的sql_id.txt

1.简单介绍以及测试使用zsh遇到的问题:
--//前段时间写的,链接http://blog.itpub.net/267265/viewspace-2659623/=>[20191011]通过bash计算sql语句的sql_id.txt
--//bash无法直接实现各种进制的相互转化,我看了bash手册以及上网查一些资料.我发现zsh可以直接实现.
--//例子如下:
zsh$ echo $(( [##32]16#$v2 ))
--//这样可以使用16进制转32进制。v2是16进制数值。

--//很奇怪的是我linux 服务器测试环境,无论bash或者zsh都存在一些小问题.
$ echo $BASH_VERSION
3.2.25(1)-release
--//执行echo "sql_id(32) = $(printf "%013s" $res )"前面的0无法输出。而高版本的bash就没有这个问题。
--//而zsh也是遇到相似的问题,而且zsh无法通过如下模式提取特定位置字符串.例子:

zsh$ v2=${v1:(-16):16}

--//另外执行如下会直接输出{A..V},bash会输出 A B .... V.而输出{0..9}没问题,奇怪.
zsh$ echo {A..V}
{A..V}

% echo {0..9}
0 1 2 3 4 5 6 7 8 9

--//不过我在windows下的Cygwin64测试没有问题.
zsh% echo $ZSH_VERSION
4.2.6

--//不过奇怪的是在windows下的Cygwin64,zsh仅仅最大支持36进制转换.
--//如下在cygwin下执行:
zsh$ echo $(( 63#F ))
zsh: invalid base (must be 2 to 36 inclusive): 63

--//但是在linux下zsh好像编码很奇怪.
% echo $(( 64#z ))
35
% echo $(( 64#Z ))
35

--//大小写zZ输出都是35,我感觉zsh可能最大支持36进制,我当前使用版本不报错罢了.
--//可以确定zsh的编码字符是0-9 A-Z.虽然支持小写输入,但是输出全部是大小字母或者数字.
zsh$ echo $(( [##16]36#F ))
F
zsh$ echo $(( [##16]36#f ))
F

--//有了以上信息,编写转换程序就很容易了.另外你可以完成在bash下调用zsh.只要在开始前写入#! /bin/zsh.当然前提是你已经安装了
--//zsh.

2.补充介绍zsh以及其他shell:
--//一般许多linux发布版本缺省shell都是bash,实际上bash已经变得越来越大,支持功能也越来越多,启动后占用内存也越来越多。这
--//点可以看/bin/bash文件大小可以确定。
--//zsh第一次看到它,我的感觉Z表示英文字符最后一个。也许想成为许多shell的终结者。
--//实际上zsh和bash,我个人的感觉两组开发人员会相互借鉴,我自己个人实在没时间精力学习它。
--//还有一个shell叫fish,我开始以为fi表示finish的意思,实际上Fish 是"the friendly interactive shell"的简称,最大特点就是
--//方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。但它的缺点就是与bash兼容性较差。
--//csh(tcsh)现在我估计很少人使用了,就不再介绍。

3.测试:
$ export ODEBUG=1

$ ./sql_id.zsh "select /*+ 12345678abdef */ sysdate from dual "
v1=EF5A2C4876C9E93D0A82FF9604F95E26 v2=A82FF9604F95E26 v3=83451430
sql_text = select /*+ 12345678abdef */ sysdate from dual
full_hash_value(16) = EF5A2C4876C9E93D0A82FF9604F95E26
hash_value(10) = 83451430
sql_id(32) = 0p0rzks2gkrj6
sql_id(32) =  p0rzks2gkrj6

--//我的这个版本没有前面输出前面的0。sql_text输出没有后面的的\0.

$ ./sql_id.zsh "select * from emp where deptno=10"
v1=8BB974871A4F8C88529EA4885EFE0842 v2=529EA4885EFE0842 v3=1593706562
sql_text = select * from emp where deptno=10
full_hash_value(16) = 8BB974871A4F8C88529EA4885EFE0842
hash_value(10) = 1593706562
sql_id(32) = 557p4j1ggw222
sql_id(32) = 557p4j1ggw222

--//OK,完全能对上.代码看上去更加简洁.贴一个sql_id.sh输出:
$ ./sql_id.sh "select * from emp where deptno=10"
sql_text = select * from emp where deptno=10\0
full_hash_value(16) = 8BB974871A4F8C88529EA4885EFE0842
hash_value(10) = 1593706562
sql_id = 557p4j1ggw222

4.脚本如下:
$ cat sql_id.zsh
#! /bin/zsh
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
odebug=${ODEBUG:-0}

sql_text=${1}'\0'
v1=$(echo -e -n "$sql_text" | md5sum | sed 's/  -//' | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')
#v2=${v1:(-16):16}
#v3=${v2:(-8):8}
v2=$(echo "obase=16;ibase=16; $v1 % 10000000000000000" | bc| tr -d '\\\r\n')
v3=$(echo "obase=10;ibase=16; $v1 % 100000000" | bc| tr -d '\\\r\n')

if [ $odebug -eq 1 ] ; then
        echo v1=$v1 v2=$v2 v3=$v3
fi

echo "sql_text = $sql_text"
echo "full_hash_value(16) = $v1 "
echo "hash_value(10) = $v3 "
#echo "hash_value(10) = $(( 16#$v3 )) "

#res=$( echo $(( [##32]16#$v2 )) | tr $( echo {0..9} {A..V}| tr -d ' ') $(echo {0..9} {a..z} | tr -d 'eilo ') )
res=$( echo $(( [##32]16#$v2 )) | tr 'ABCDEFGHIJKLMNOPQRSTUV'  'abcdfghjkmnpqrstuvwxyz' )
echo "sql_id(32) = $(printf "%13s" $res | tr ' ' '0')"
echo "sql_id(32) = $(printf "%013s" $res )"

--//bash的脚本:
$ cat sql_id.sh
#! /bin/bash
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
odebug=${ODEBUG:-0}

sql_text=${1}'\0'
v1=$(echo -e -n "$sql_text" | md5sum | sed 's/  -//' | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')
v2=${v1:(-16):16}
v3=${v2:(-8):8}
# v2=$(echo "obase=16;ibase=16; $v1 % 10000000000000000" | bc| tr -d '\\\r\n')
# v3=$(echo "obase=10;ibase=16; $v1 % 100000000" | bc| tr -d '\\\r\n')

if [ $odebug -eq 1 ] ; then
        echo v1=$v1 v2=$v2 v3=$v3
fi

echo "sql_text = $sql_text"
echo "full_hash_value(16) = $v1 "
echo "hash_value(10) = $(( 16#$v3 )) "

BASE32=($(echo {0..9} {a..z} | tr -d 'eilo'))
res=''
for i in $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n')
do
        res=${res}${BASE32[$(( 10#$i ))]}
done
echo "sql_id(32) = $(printf "%13s" $res | tr ' ' '0')"
echo "sql_id(32) = $(printf "%013s" $res)"

res1=$(eval $(echo "obase=32;ibase=16; $v2" | bc| tr -d '\\\r\n' | awk 'BEGIN{RS=" +"; printf "echo " }/./{printf "${BASE32[$(( 10#%02d))]} ", $1}' ))
res1=$(tr -d " " <<< $res1)
echo "sql_id(32) = $(printf "%013s" $res1)"

[20191101]通过zsh计算sql语句的sql_id.txt的更多相关文章

  1. [20191011]通过bash计算sql语句的sql_id.txt

    [20191011]通过bash计算sql语句的sql_id.txt --//当我知道如何通过bash计算sql语句的full_hash_value ,就很想通过bash编程计算sql_id.当时受限 ...

  2. [20171110]sql语句相同sql_id可以不同吗.txt

    [20171110]sql语句相同sql_id可以不同吗.txt --//提一个问题,就是sql语句相同sql_id可以不同吗?--//使用dbms_shared_pool.markhot就可以做到. ...

  3. [20190328]简单探究sql语句相关mutexes.txt

    [20190328]简单探究sql语句相关mutexes.txt --//摘要:http://www.askmaclean.com/archives/understanding-oracle-mute ...

  4. vertica时间计算SQL语句实例:统计一天内登录的用户

    SQL语句实例: select count(id) as num from public.user where cast((CURRENT_TIMESTAMP-login_timed) day as ...

  5. 计算sql语句的查询时间

    set statistics profile on set statistics io on set statistics time on go <这里写上你的语句...> go set ...

  6. 常用日期计算SQL语句

    -- 本月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) -- 本月的最后一天 SELECT DATEADD(ms,-3,DATEADD(mm ...

  7. 查看SQL语句的真实执行计划

    DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...

  8. 如何使用SQLPLUS分析SQL语句(查询执行计划跟踪)

    方法一:autotrace 1,  connect sys/密码 as sysdba,在sys用户下运行$ORACLE_HOME/sqlplus/admin/plustrce.sql这段sql的实际内 ...

  9. ORACLE 查看有多个执行计划的SQL语句

    在SQL优化过程,有时候需要查看哪些SQL具有多个执行计划(Multiple Executions Plans for the same SQL statement),因为同一个SQL有多个执行计划一 ...

随机推荐

  1. 【Linux 命令】cp 命令详解

    Linux 命令之 cp 命令详解 一.cp 命令简介 cp 命令主要用于复制文件或目录.即用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp 命令可以将单个源文件复制成一个指定文件名的 ...

  2. Android Studio中的AndroidManifest.xml文件分析

    一.关于AndroidManifest.xml AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Acti ...

  3. Nacos 安装(带视频)

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 疯狂创客圈 高并 ...

  4. MySQL数据库基础笔记

    数据库 数据库就是存储和管理数据的仓库,用户可以对数据库中的数据进行增删改查等操作. 数据库的分类 关系型数据库(Oracle.MySQL.SQLite等) 非关系型数据库(Redis.MongoDB ...

  5. 高阶函数 - Higher Order Function

    一个函数如果有 参数是函数 或 返回值是函数,就称为高阶函数. 这篇文章介绍高阶函数的一个子集:输入 fn,输出 fn'. 按 fn 与 fn' 功能是否一致,即相同输入是否始终对应相同输出,把这类高 ...

  6. Xshell/Xftp连接Linux速度非常慢(已解决)

    原因: 在使用shell连接虚拟机时连接等待时间太长,ssh的服务端在连接时会自动检测dns环境是否一致导致的,修改为不检测即可! 解决方案: 1.打开sshd服务的配置文件/etc/ssh/sshd ...

  7. sqlserver 标准系统数据库

    SQL server系统数据库很重要,大部分时候都不应该修改他们.唯一例外的是model数据库和tempdb数据库.model数据库允许部署更改到任何新创建的数据库(如存储过程),而更改tempdb数 ...

  8. Git实战指南----跟着haibiscuit学Git(第八篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  9. 剑指offer笔记面试题8----二叉树的下一个节点

    题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). ...

  10. iOS----------componentsJoinedByString 和 componentsSeparatedByString 的方法的区别

    将string字符串转换为array数组 NSArray  *array = [Str componentsSeparatedByString:@","]; ==反向方法 将arr ...