[20191101]通过zsh计算sql语句的sql_id.txt
[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的更多相关文章
- [20191011]通过bash计算sql语句的sql_id.txt
[20191011]通过bash计算sql语句的sql_id.txt --//当我知道如何通过bash计算sql语句的full_hash_value ,就很想通过bash编程计算sql_id.当时受限 ...
- [20171110]sql语句相同sql_id可以不同吗.txt
[20171110]sql语句相同sql_id可以不同吗.txt --//提一个问题,就是sql语句相同sql_id可以不同吗?--//使用dbms_shared_pool.markhot就可以做到. ...
- [20190328]简单探究sql语句相关mutexes.txt
[20190328]简单探究sql语句相关mutexes.txt --//摘要:http://www.askmaclean.com/archives/understanding-oracle-mute ...
- vertica时间计算SQL语句实例:统计一天内登录的用户
SQL语句实例: select count(id) as num from public.user where cast((CURRENT_TIMESTAMP-login_timed) day as ...
- 计算sql语句的查询时间
set statistics profile on set statistics io on set statistics time on go <这里写上你的语句...> go set ...
- 常用日期计算SQL语句
-- 本月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) -- 本月的最后一天 SELECT DATEADD(ms,-3,DATEADD(mm ...
- 查看SQL语句的真实执行计划
DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...
- 如何使用SQLPLUS分析SQL语句(查询执行计划跟踪)
方法一:autotrace 1, connect sys/密码 as sysdba,在sys用户下运行$ORACLE_HOME/sqlplus/admin/plustrce.sql这段sql的实际内 ...
- ORACLE 查看有多个执行计划的SQL语句
在SQL优化过程,有时候需要查看哪些SQL具有多个执行计划(Multiple Executions Plans for the same SQL statement),因为同一个SQL有多个执行计划一 ...
随机推荐
- 轻松玩转windows之redis实战
Redis是一个常用的键值对数据库.本篇分享一下如何轻松在睿江云上实现基于windows的redis开发环境. 1. 登录睿江云 点击右上角登录框 进入登录页面,输入账号密码登录 进入控制台, ...
- linux bash变量作用域
linux bash变量作用域 一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的? shell会去$PATH环境变量定义的目录里去找这个命令.环境变量里一般包括/usr ...
- RedisSession (自定义)
RedisSession (自定义) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Red ...
- mysql优化:覆盖索引(延迟关联)
前言 上周新系统改版上线,上线第二天就出现了较多的线上慢sql查询,紧接着dba 给出了定位及解决方案,这里较多的是使用延迟关联去优化. 而我对于这个延迟关联也是第一次听说(o(╥﹏╥)o),所以今天 ...
- javascript数组拆分为三个一组
首先构建原始数据. var arr = [ {name:'yanggb1',age:'15'}, {name:'yanggb2',age:'16'}, {name:'yanggb3',age:'17' ...
- C#使用Linq to csv读取.csv文件数据2_处理含有非列名数据的方法(说明信息等)
第一篇博客为:https://www.cnblogs.com/lxhbky/p/11884474.html 本文主要是为了解决上面博客遗留的一个含有不规范数据的一种方法,目前暂时没有从包里发现可以从第 ...
- 安装指定版本的tensorflow(我报错了)
安装命令如下: pip install tensorflow-gpu==1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 慎用,反正我报错了,而且还 ...
- Android 下载进度对话框 ProgressDialog
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...
- 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑
<Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...
- QT--图灵机器人
QT--图灵机器人 1.登陆图灵机器人官网注册一个图灵机器人 2.获取apikey 3.pro文件添加 QT += core gui network 4.头文件 #include < ...